我一直在使用SWIG - 通常我喜欢它。 但是使用ctypes看起来很容易做回调函数。
如何结合与C dll交互的两种“方式”?
第一步是知道如何在通过导入相应的SWIG模块加载dll之后将ctypes对象发送到dll。
谢谢,
塞巴斯蒂安。
答案 0 :(得分:0)
缓冲协议可能是您最好的选择(http://docs.python.org/c-api/buffer.html)。
从C代码(例如swig生成的代码),您可以通过访问此接口获取指向底层C数据的指针。
注意缓冲区接口有两个版本,python 2.x中的ctypes对象将公开旧协议,在python 3.x中它们会公开新的协议。
你将不得不深入到Python C API级别,但是如果你很好地包装所有东西只需要一次 - 例如,可能使%inline函数为支持缓冲协议的任何东西返回void *,并在类型映射中使用它你的回调类型。
答案 1 :(得分:0)
如果x.pyd是swig编译的扩展模块,那么你可以通过这种方式通过ctypes加载dll:
import x
from ctypes import PyDLL
dll = PyDLL(x.__file__)
根据导出函数使用的调用约定,您可能需要使用PyDLL,WinDLL或CDLL。