如何将SwigPyObject强制转换为ctypes void *

时间:2013-11-25 21:29:32

标签: python c++ c swig ctypes

我有一个python,ctypes包装函数到C API,为类X取一个void *参数,例如 C:

myFunc(void* aXHandle); //where X is a class, of class X.

对于X类,我可以访问一个swigged API并且可以获得myX.this,它是SwigPyObject类型。

如何转换这个以便我可以使用ctypes并使用ctypes c_void_p作为参数来调用我的C-API函数? 在Python中,我想到的是:     aXObjectThis = myX.this

myHandle = cast(aXObjectThis, c_void_p)

但这不起作用;得到“参数1中的错误类型”

1 个答案:

答案 0 :(得分:2)

__int__ SwigPyObject方法由SwigPyObject_long处理PyLong_FromVoidPtr(v->ptr)。它返回myHandle = c_void_p(int(myX.this)) ,因此您应该能够使用以下内容:

_as_parameter_

更方便的是,ctypes会查找type(myX)._as_parameter_ = property( lambda self: c_void_p(int(self.this))) 属性。您可以在实例上或作为属性设置:

myFunc(myX)

只需致电{{1}}。