从 Objective-C 调用 Python 代码

Posted

技术标签:

【中文标题】从 Objective-C 调用 Python 代码【英文标题】:Calling Python code from Objective-C 【发布时间】:2012-10-24 10:33:03 【问题描述】:

我正在寻找从 Objective-C 程序调用 Python 代码的最佳方式。 一些细节:

Python 的代码根本不使用 PyObjC,只是 Python 的基础。 有多个 Python 文件,每个文件具有相似的功能(也称为“主题变体”)。

NSBundle

首先想到的是将每个 *.py 封装到 *.bundle 中。

PythonClass.py:

import objc
NSObject = objc.lookUpClass('NSObject')

class PythonClass(NSObject):
    def Function(self):
        print("Python is speaking!")

setup.py:

from distutils.core import setup
import py2app

setup(
    plugin = ['PythonClass.py'],
)

终端命令:python setup.py py2app -s -p objc

它工作正常,但有几个问题:

大 *.bundle 大小。即使 Foundation is not imported 和 bundle 是半独立的(标志“-s”),*.bundle 的大小约为 1MB。有没有其他方法可以减小尺寸? PyObjC 依赖。类不使用 objc,但如果我们不继承 NSObject,那么在 Objective-C 方面,[bundle principalClass](Null)PythonClass 不能被实例化。有没有办法避免在 *.py 中使用NSObject

CFBundle

我也一直在考虑使用CFBundle,但是CFBundleGetFunctionPointerForName(...) 总是返回NULL(当然,在这种情况下,*.py 包含一个函数,而不是一个类)。我找不到关于这件事的任何材料。也许你们中的一些人更幸运。

有没有更好的方法将 Python 嵌入到 Objective-C 中?

【问题讨论】:

【参考方案1】:

使用 Python/C API(Python 和 C 之间的桥梁)、调用 Python 代码的 C++ 类(OOP 层,便于管理)和this 方法将 C++ 类放入 CFBundle。

如有必要,这也适用于动态库 (*.dylib) 而不是 CFBundle。

【讨论】:

以上是关于从 Objective-C 调用 Python 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何从Javascript调用Objective-C方法并将数据发送回iOS中的Javascript?

从objective-c++调用swift函数

从objective-c调用javascript函数的语法

从 Javascript 调用 Objective-C 方法

从 Swift 测试文件中调用 Objective-C 类

使用另一个 C++ 类作为参数从 Objective-C(++) 调用 C++ 方法