结合ctypes和swig

时间:2011-10-25 08:45:52

标签: python swig ctypes

我一直在使用SWIG - 通常我喜欢它。 但是使用ctypes看起来很容易做回调函数。

如何结合与C dll交互的两种“方式”?

第一步是知道如何在通过导入相应的SWIG模块加载dll之后将ctypes对象发送到dll。

谢谢,
塞巴斯蒂安。

2 个答案:

答案 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。