开发者社区> 问答> 正文

如何从python访问自定义Swift或Objective C框架

大多数示例展示了如何从swift / objective-c代码调用python框架。但是我想做相反的事情,我想从python调用swift的公开函数。有什么办法吗?

最好的方法是将通过PyObjCObjective-C / swift编写的自定义,特定于应用程序的非系统框架(即不在提供的框架包装中)暴露给PyObjC桥上的python。

我想开发一个“混合”应用程序,其中该应用程序的某些部分在Objective-C / swift中,而其他部分在python中,并且通过PyObjC桥将其两侧集成在一起。

我能够找到的大多数文档似乎都集中在以下情况下:目标是将所有特定于应用程序的代码都存储在python中,并通过桥和pre将python调用到AppKit类中,等等。打包的系统框架包装器。

展开
收起
祖安文状元 2020-02-21 17:55:40 949 0
1 条回答
写回答
取消 提交回答
  • 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。

    2020-02-21 17:55:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OpenStack Swift 海量小文件优化之路 立即下载
From Java/Android to Swift iOS 立即下载
Swift在Airbnb的应用实践 立即下载