大多数示例展示了如何从swift / objective-c代码调用python框架。但是我想做相反的事情,我想从python调用swift的公开函数。有什么办法吗?
最好的方法是将通过PyObjCObjective-C / swift编写的自定义,特定于应用程序的非系统框架(即不在提供的框架包装中)暴露给PyObjC桥上的python。
我想开发一个“混合”应用程序,其中该应用程序的某些部分在Objective-C / swift中,而其他部分在python中,并且通过PyObjC桥将其两侧集成在一起。
我能够找到的大多数文档似乎都集中在以下情况下:目标是将所有特定于应用程序的代码都存储在python中,并通过桥和pre将python调用到AppKit类中,等等。打包的系统框架包装器。
PyObjC的主要用例是从Python访问Objective-C代码,但是可以使用PyObjC为Python中的ObjC / Swift应用程序实现某些功能。
充其量只是很少记载。有两种解决方法:
实现对插件包的支持,并使用python代码创建插件包(使用py2app进行打包)。这是在一个非常古老的PyObjC教程中记录的:https ://pyobjc.readthedocs.io/en/latest/tutorials/embedded.html
为应用程序添加对Python扩展的显式支持。
我会选择第二个选项,因为最终这是更容易实现的选项。
要到达那里,您需要做一些事情:
初始化python解释器并运行一些启动代码。请参阅“ Py_Initialize()”和“ PyRun_SimpleString()”以进行此操作(或有关在应用程序中嵌入Python的教程)。
确保在运行启动代码后释放GIL(嵌入时通常不需要此操作,但在使用PyObjC时尤其是在不同线程可能调用Python代码的情况下则需要这样做)
将ObjC API公开给Python
这可能是容易的,也可能是困难的,这取决于两个部分之间的接口有多复杂。将ObjC类暴露给Python很容易:只需使用“ objc.lookUpClass(classname)”即可在Python中访问ObjC类。这也会自动公开类上的所有方法。
方法访问可能需要做更多的工作,尤其是在该方法具有传递引用自变量或使用块的情况下。
可以访问全局变量和C函数,但是还需要进行更多工作,因为PyObjC无法从ObjC运行时API中读取它们。PyObjC文档包含有关如何在需要时访问它们的信息。
在代码的Python和ObjC部分之间建立链接。我将在Python中创建Python对象,然后添加ObjC API(使用PyObjC)将其传递给应用程序的ObjC代码。
为了在ObjC方面获得更好的体验,您需要在ObjC中定义将由Python代码实现的协议。
最后,请注意:所有这些都是为了从Python(而不是Swift)访问Objective-C API。这也应该适用于Swift代码,但前提是您必须在swift(@objc)中实现ObjC接口。PyObjC不能用于访问任意Swift API。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。