gpt4 book ai didi

python - 使用 PyRun_File()/PyObject_CallFunction() 时,如何将 Objective C 实例传递到 PyObjC Python 函数中?

转载 作者:行者123 更新时间:2023-12-01 05:22:51 29 4
gpt4 key购买 nike

我使用 PyObjC 将 Python 嵌入到 Objective C 应用程序中,在 ObjC 端手动设置 Python 环境(即不使用 py2app)。我在一个单独的线程(ObjC 端)中启动 Python,调用 PyRun_File(),然后调用 PyObject_CallFunction() 来启动它做某事(具体更新一些菜单,注册并处理菜单回调)。 Python 函数启动辅助线程的运行循环,并且回调类实例会挂起。所有这些都有效。我可以毫无问题地将字符串等基本数据传递给初始 Python 函数,并且菜单操作可以按照我的意愿工作。

我想为 Python 函数提供一个预实例化的委托(delegate)实例,以便于配置(从 Objective C 开发人员的角度来看)。如何将 Objective C 实例(我的委托(delegate))传递给 Python 函数?是否可以?我是否缺少桥接功能?我需要手动创建一个适当配置的 PyObject 吗?我应该在 Python 端进行什么样的转换才能确保 delegate.methods() 可以在 Python 中使用并且代理可以正常工作?是否有任何我应该注意的内存管理问题(在桥的两侧)?

我正在使用 Python 2.7、PyObjC 2.5 并面向 OSX 10.6。如果解决方案特别需要的话,很乐意考虑更改其中任何一个。 TIA。

最佳答案

确保桥的无问题使用的最简单方法是确保您使用的委托(delegate)方法不使用 C 数组作为参数或返回值,也不使用可变参数签名(“...”)。进一步确保所有按引用传递的参数(例如常用的“NSError**”参数)都用“in”、“out”或“inout”标记,以指示值传递的方向。这确保了桥可以从 Objective-C 运行时获取所需的所有信息。

有两个选项可将预构造对象传递给 Python 代码:

  1. 创建返回对象的类方法

  2. 使用 PyObjC API 为 Objective-C 对象创建 python 代理。

后者使用内部 PyObjC API(也由框架包装器使用),并且可能会在 PyObjC 的 future 版本中中断。也就是说,我没有积极的计划来打破我在这里描述的解决方案。

首先确保 Objective-C 编译器可以使用正确版本的“pyobjc-api.h”和“pyobjc-compat.h”。

使用#include "pyobjc-api.h" 使 API 可用。

在初始化 Python 解释器之后、使用任何其他 PyObjC 函数之前调用“PyObjC_ImportAPI”。

使用“pyValue = PyObjC_IdToPython(objcValue)”为 Objective-C 对象创建 Python 表示。

关于python - 使用 PyRun_File()/PyObject_CallFunction() 时,如何将 Objective C 实例传递到 PyObjC Python 函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988970/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com