2012-10-24 69 views
2

我正在尋找從Objective-C程序中調用Python代碼的最佳方式。 一些細節:從Objective-C調用Python代碼

  • Python的代碼根本不使用PyObjC,只是Python的基礎知識。
  • 有幾個具有相似功能的Python文件(又名「主題變體」)。

一個NSBundle

封裝每個*的.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

它工作正常,但有幾個問題:

  • Large * .bundle size。儘管Foundation is not imported和捆綁包是半獨立的(標誌「-s」),但是.bundle的大小爲〜1MB。還有其他減小尺寸的方法嗎?
  • PyObjC依賴。 Class不使用objc,但如果我們沒有繼承NSObject,那麼在Objective-C端,[bundle principalClass](Null)PythonClass不能被實例化。有沒有辦法避免在* .py中使用NSObject

的CFBundle

我也一直在考慮使用CFBundle,但CFBundleGetFunctionPointerForName(...)總是返回NULL(當然,在這種情況下,*的.py包含一個函數,不是類)。在這件事上我找不到任何材料。也許你們中的一些人更幸運。

有沒有更好的將Python嵌入Objective-C的方法?

回答

0

使用Python/C API(Python和C之間的橋樑),調用Python代碼的C++類(用於更易於管理的OOP層)以及用於將C++類放入CFBundle的方法this

如果需要,這也適用於Dynamic Library(* .dylib)而不是CFBundle。