从Objective-C调用Python
B嗯,关于如何做到这一点,我有一个概要,但我无法完成细节。Python代码去了哪里,我的Objective-C代码如何知道它?如何在命令行上编译它?谷歌是你的朋友。在字符串“Cocoa Python”上执行搜索很快就出现了。不幸的是,在Objective-C应用程序中通过PyObjC使用Python的故事目前不是很好从Objective-C调用Python,python,objective-c,Python,Objective C,B嗯,关于如何做到这一点,我有一个概要,但我无法完成细节。Python代码去了哪里,我的Objective-C代码如何知道它?如何在命令行上编译它?谷歌是你的朋友。在字符串“Cocoa Python”上执行搜索很快就出现了。不幸的是,在Objective-C应用程序中通过PyObjC使用Python的故事目前不是很好py2app可以编译可加载的bundle(即可以通过NSBundle加载),这似乎是最好的方法:在python中定义一个NSObject子类,该子类实现您在Objective-C中定
py2app
可以编译可加载的bundle(即可以通过NSBundle
加载),这似乎是最好的方法:在python中定义一个NSObject
子类,该子类实现您在Objective-C中定义的协议(通过objc.protocolNamed
获得),然后通过py2app(使用标准setup.py)将这个python文件编译成一个可加载的包。不幸的是,py2app
没有受到太多的喜爱,尤其是plugin(loadable bundle)目标,并且在10.5左右引入了严重的内存泄漏,使得从py2app编译的bundle传递到Objective-C的任何数据都会泄漏。恶心
PyObjC根据在Python中执行的与ObjC相关的代码来操作Objective-C运行时,因此为了能够从Objective-C调用Python代码,一般大纲如下
NSClassFromString
等来实例化该类。使用适当的方法声明一个@协议
,这样Objective-C编译器就不会抱怨缺少方法,这是很有帮助的main.m
中的代码,您应该能够创建Python解释器,执行PyObjC代码,然后继续。显然,解释器需要保持运行,以便python代码能够执行,因此您可能必须从单独的线程执行。正如你所见,这可能会有点毛茸茸的。最好使用Python应用程序,如上所述
请记住,PyObjC不能保证很好地使用Objective-C垃圾收集器,因此所有这些选项都要求Objective-C代码不使用GC。来源:
我已经发布了一篇文章,因为它比我在这里发布的文章要长一点
抽象摘要保持不变:使用抽象类提供使C编译器满意所需的类型信息和使桥接器满意所需的元数据。这在《雪豹》中不是已经停止了吗?我不这么认为,上周我在雪豹上做了一个关于PyObjC的演示。PyObjC包含在雪豹中,苹果仍然非常支持。PyObjC模板不再包含在Xcode中,因为Xcode的发布周期比PyObjC长得多。您仍然可以从PyObjC项目网站()下载模板,我使用了PyObjC,它“包装”了Objective-C for Python。我想知道怎么走另一条路。汤姆写得很好。我认为难点仍然是如何设置调用python,而不需要对Objective-C进行最初的python调用。换句话说,如何从现有的Objective-C应用程序中调用python代码?或者如何使用python为Objective-C应用程序编写插件?