【发布时间】:2011-10-25 08:45:52
【问题描述】:
我已经使用 SWIG 很长时间了 - 通常我喜欢它。 但是使用 ctypes 执行回调函数似乎(更)容易。
如何结合使用 C dll 交互的两种“方式”?
第一步是要知道,在已经通过导入相应的 SWIG 模块加载 dll 之后,如何将 ctypes 对象获取到 dll。
谢谢,
塞巴斯蒂安。
【问题讨论】:
我已经使用 SWIG 很长时间了 - 通常我喜欢它。 但是使用 ctypes 执行回调函数似乎(更)容易。
如何结合使用 C dll 交互的两种“方式”?
第一步是要知道,在已经通过导入相应的 SWIG 模块加载 dll 之后,如何将 ctypes 对象获取到 dll。
谢谢,
塞巴斯蒂安。
【问题讨论】:
如果x.pyd是swig编译后的扩展模块,那么可以通过ctypes这样的方式加载dll:
import x
from ctypes import PyDLL
dll = PyDLL(x.__file__)
根据导出函数使用的调用约定,您可能需要使用 PyDLL、WinDLL 或 CDLL。
【讨论】:
缓冲协议可能是您最好的选择 (http://docs.python.org/c-api/buffer.html)。
从 C 代码(例如 swig 生成的代码)中,您可以通过访问此接口获取指向底层 C 数据的指针。
注意缓冲区接口有两个版本,python 2.x 中的 ctypes 对象将暴露旧协议,在 python 3.x 中它们会暴露新协议。
您将不得不深入到 Python C API 级别,但只有一次,如果您将所有内容都包装好 - 例如,可能为任何支持缓冲区协议的内容创建一个返回 void* 的 %inline 函数,并在类型映射中使用它你的回调类型。
【讨论】: