2013-11-25 22 views
0

我有一個Python,ctypes的包裝的函數的C API服用一個void *一類X參數,例如 C:如何投下SwigPyObject到ctypes的無效*

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

__int__方法SwigPyObjectSwigPyObject_long處理,在pyrun.swg中定義。它返回PyLong_FromVoidPtr(v->ptr),所以你應該能夠使用以下命令:

myHandle = c_void_p(int(myX.this)) 

更方便的ctypes尋找一個_as_parameter_屬性。您可以在實例或屬性上設置此項:

type(myX)._as_parameter_ = property(
    lambda self: c_void_p(int(self.this))) 

簡單地說,請致電myFunc(myX)

+0

謝謝!這似乎可以節省一些打字!尼斯 –