代码之家  ›  专栏  ›  技术社区  ›  telliott99

从objective-c调用python

  •  4
  • telliott99  · 技术社区  · 15 年前

    BBUM posted 如何完成此操作的大纲,但我无法完成详细信息。python代码在哪里,我的objective-c代码如何知道它?我如何在命令行上编译它?

    3 回复  |  直到 15 年前
        1
  •  12
  •   bbum    15 年前

    资料来源:

    Calling Python From Objective-C

    我张贴了一张 full explanation of how to do this to my weblog 因为它比我在这里张贴的东西要长得多。

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

        2
  •  3
  •   Barry Wark    15 年前

    不幸的是,在Objective-C应用程序中通过pyobjc使用python的故事目前还不是很好。 py2app 使用pyobjc的哪些船可以编译可加载的捆绑包(即可以通过 NSBundle ,这似乎是最好的方法:定义 NSObject python中实现协议的子类(通过 objc.protocolNamed )在Objective-C中定义,然后通过py2app(使用标准的setup.py)将这个python文件编译成一个可加载的包。不幸的是, PY2APP 对插件(可加载包)目标没有太大的兴趣,大约10.5年左右出现了一个严重的内存泄漏,任何数据从py2app编译的包泄漏中从python传递到objective-c。讨厌。

    pyobjc根据在python中执行的与objc相关的代码来操纵objective-c运行时,因此为了能够从objective-c调用python代码,一般的概要如下

    1. 围绕python代码编写pyobjc包装器
    2. 执行声明pyobjc包装器的代码以将这些定义添加到objc运行时
    3. 从objective-c调用pyobjc包装器。因为它是在运行时声明的,所以符号在编译时不可用,因此必须使用 NSClassFromString 等。实例化类。它有助于声明 @protocol 使用适当的方法,这样Objective-C编译器就不会抱怨缺少的方法。

    如果您有灵活性,最好的选择是使用cocoa python应用程序模板(即创建一个python应用程序),然后从python中将object-c代码作为可加载包加载。这将为您管理python解释器。

    否则,代码在 main.m 对于cocoa python应用程序模板,您应该能够创建一个python解释器,执行pyobjc代码,然后继续。显然,解释器需要保持运行,以便您的python代码可以执行,所以您可能需要从一个单独的线程执行此操作。正如你所看到的,这会变得有点毛茸茸的。最好使用python应用程序,如上所述。

    请记住,PyobJC不能保证与Objective-C垃圾收集器很好地配合使用,因此所有这些选项都要求Objective-C代码不使用GC。

        3
  •  0
  •   Lyndsey Ferguson    15 年前

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