bbum posted概述了如何做到这一点,但我无法完成细节。 Python代码在哪里,我的Objective-C代码将如何知道它?我如何在命令行上进行编译?
答案 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代码,总体概述就像
NSClassFromString
等。实例化该类。使用适当的方法声明@protocol
是有帮助的,这样Objective-C编译器就不会抱怨缺少方法。如果您具有灵活性,最好的选择是使用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。