繁体   English   中英

从Objective-C调用Python代码

[英]Calling Python code from Objective-C

我正在寻找从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 ,并且包是半独立的(标志“ -s”),*。bundle的大小也约为1MB。 还有其他减小尺寸的方法吗?
  • PyObjC依赖性 类不使用objc,但是如果我们不对NSObject进行子类化,那么在Objective-C方面, [bundle principalClass] PythonClass [bundle principalClass](Null)PythonClass无法实例化PythonClass 有没有办法避免在* .py中使用NSObject

CF束

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM