结合ctypes和swig
我使用SWIG已经很长时间了,整体来说我还是挺喜欢它的。不过,用ctypes来处理回调函数似乎要简单得多。
我想知道怎么把这两种与C库(dll)交互的方式结合起来?
第一步是要知道,在通过导入相应的SWIG模块加载了dll之后,怎么把ctypes对象传递给这个dll。
谢谢,
Sebastian。
2 个回答
0
如果x.pyd是用swig编译的扩展模块,那么你可以通过ctypes以这种方式加载这个dll文件:
import x
from ctypes import PyDLL
dll = PyDLL(x.__file__)
根据导出函数使用的调用约定,你可能需要使用PyDLL、WinDLL或CDLL。
0
缓冲区协议可能是你最好的选择(http://docs.python.org/c-api/buffer.html)。
在C代码中(比如通过swig生成的代码),你可以通过这个接口获取到底层C数据的指针。
要注意,缓冲区接口有两个版本,Python 2.x中的ctypes对象会使用旧的协议,而在Python 3.x中则使用新的协议。
你需要深入到Python的C API层面,不过只需要做一次,如果你把所有东西整理得很好——比如可以创建一个返回void*的%inline函数,用于支持缓冲区协议的内容,并在你的回调类型的类型映射中使用它。