结合ctypes和Swig

3

我已经使用SWIG有一段时间了-总的来说我很喜欢它。但是使用ctypes似乎更容易实现回调函数。

我该如何将这两种与C dll交互的方式结合起来?

第一步是要知道,在通过导入相应的SWIG模块加载dll之后,如何获取ctypes对象。

谢谢,
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函数,并在回调类型的typemaps中使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接