Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Objective-C调用Python_Python_Objective C - Fatal编程技术网

从Objective-C调用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中定

B嗯,关于如何做到这一点,我有一个概要,但我无法完成细节。Python代码去了哪里,我的Objective-C代码如何知道它?如何在命令行上编译它?

谷歌是你的朋友。在字符串“Cocoa Python”上执行搜索很快就出现了。

不幸的是,在Objective-C应用程序中通过PyObjC使用Python的故事目前不是很好
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代码,一般大纲如下

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

    否则,使用Cocoa Python应用程序模板的
    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应用程序编写插件?