2

Objective-C プログラムから Python コードを呼び出す最良の方法を探しています。詳細:

  • Python のコードは PyObjC をまったく使用せず、Python の基本のみを使用します。
  • それぞれ同様の機能を備えた Python のファイルがいくつかあります (別名「テーマのバリエーション」)。

NSバンドル

各 *.py を *.bundle にカプセル化することが最初に頭に浮かんだことでした。

PythonClass.py:

import objc
NSObject = objc.lookUpClass('NSObject')

class PythonClass(NSObject):
    def Function(self):
        print("Python is speaking!")

setup.py:

from distutils.core import setup
import py2app

setup(
    plugin = ['PythonClass.py'],
)

端末コマンド:python setup.py py2app -s -p objc

正常に動作しますが、いくつかの問題があります。

  • 大・結束サイズFoundation はインポートされず、バンドルは半スタンドアロン (フラグ「-s」) ですが、*.bundle のサイズは ~1MB です。サイズを小さくする他の方法はありますか?
  • PyObjCの依存関係。クラスは objc を使用しませんが、サブクラス化しない場合NSObject、Objective-C 側で[bundle principalClass]はインスタンス(Null)PythonClassできません。NSObject*.py での使用を避ける方法はありますか?

CFバンドル

私も を使用することを考えていましCFBundleたが、CFBundleGetFunctionPointerForName(...)常に返されますNULL(もちろん、この場合 *.py にはクラスではなく関数が含まれています)。この件に関する資料は見つかりませんでした。多分あなたの何人かはもっと幸運です。

Python を Objective-C に埋め込むより良い方法はありますか?

4

1 に答える 1

0

Python/C API (Python と C の間のブリッジ)、Python コードを呼び出す C++ クラス (管理を容易にするための OOP レイヤー)、およびこのメソッドを使用して、C++ クラスを CFBundle に配置します。

必要に応じて、これは CFBundle の代わりにダイナミック ライブラリ (*.dylib) でも機能します。

于 2012-11-04T20:56:00.563 に答える