从Objective-C调用Python

时间:2009-11-20 18:45:36

标签: python objective-c

bbum posted概述了如何做到这一点,但我无法完成细节。 Python代码在哪里,我的Objective-C代码将如何知道它?我如何在命令行上进行编译?

3 个答案:

答案 0 :(得分:12)

来源:

Calling Python From Objective-C

我发布了一个full explanation of how to do this to my weblog,因为它比我在这里发布的内容要长一些。

摘要摘要保持不变:使用抽象类提供使C编译器满意所需的类型信息以及使桥接器满意所需的元数据。

答案 1 :(得分:3)

不幸的是,目前在Objective-C应用程序中通过PyObjC使用Python的故事并不是很好。与PyObjC一起提供的py2app可以编译可加载的包(即可以通过NSBundle加载),这似乎是最好的方法:在python中定义一个实现协议的NSObject子类(通过您在Objective-C中定义的objc.protocolNamed),然后通过py2app(使用标准的setup.py)将此python文件编译为可加载的包。不幸的是,py2app并没有太多的爱,尤其是插件(可加载的bundle)目标,并且在10.5左右引入了严重的内存泄漏,以便任何数据从python传递到Objective-C从py2app编译的bundle泄漏。呸。

PyObjC根据在Python中执行的与ObjC相关的代码操作Objective-C运行时,从而能够从Objective-C调用python代码,总体概述就像

  1. 围绕python代码编写PyObjC包装器
  2. 执行代码声明PyObjC包装器将这些定义添加到ObjC运行时
  3. 从Objective-C调用PyObjC包装器。因为它是在运行时声明的,所以符号在编译时不可用,因此您必须使用NSClassFromString等。实例化该类。使用适当的方法声明@protocol是有帮助的,这样Objective-C编译器就不会抱怨缺少方法。
  4. 如果您具有灵活性,最好的选择是使用Cocoa-Python应用程序模板(即创建Python应用程序),然后将Objective-C代码作为Python中的可加载包加载。这需要为您管理Python解释器。

    否则,使用Cocoa-Python应用程序模板的main.m中的代码,您应该能够创建Python解释器,执行PyObjC代码然后继续。显然,解释器需要保持运行,以便您的python代码可以执行,因此您可能必须从单独的线程执行此操作。如你所见,这可能会有点毛茸茸。如上所述,最好使用Python应用程序。

    请记住,PyObjC不能保证与Objective-C垃圾收集器一起使用,因此所有这些选项都要求您的Objective-C代码不使用GC。

答案 2 :(得分:0)

Google是你的朋友。对字符串“Cocoa Python”执行搜索很快就出现了PyObjc