2012-06-24 15 views
3

我想使用一個函數,它是從Python的DLL中定義的。 從C++函數(get_version)返回的值是一個結構處理從C++返回的結構python調用

typedef struct myStruct { 
    size_t size; 
    char * buff; 
} myStruct ; 

的Python代碼是:

lib = CDLL(myDLL.dll) 
lib.get_version 

的問題是如何處理返回的值?

我讀過VOO的答案和閱讀其他職位,但我仍然有這個

掙扎我聲明瞭結構類(美孚,從VOO的答案),並設置restype 代碼現在看起來

class Foo(Structure): 
    _fields_ = [('size', c_size_t), ('buff', c_char_p)] 

lib = CDLL(myDLL.dll) 
lib.get_version 
lib.get_version.restype = Foo._fields_ 

我收到以下錯誤 類型錯誤:restype必須是一個類型,可調用,或無

我讀到這個第二,如果我設置restype不是作爲一個列表,例如:c_char_p,誤差不出現

當我設置了restype

lib.restype =富。 領域

錯誤不再出現,但在restypeget_version設置不正確 當尋找在調試中的變量:

lib.restype =列表:[( '大小',),( '迷',)]

lib.get_version.restype = PyCSimpleType:

任何幫助,將不勝感激

+0

'ctypes'與C函數一起工作,所以如果使用C++,請確保'extern「C」'函數。 –

+0

嗨,你能告訴我什麼是函數的返回類型在DLL中? 我試過用我的myStruct,但得到錯誤:'C連接函數不能返回C++類'myStruct'' – Aleksandar

回答

2

你將不得不使用日e ctypes模塊。你只需要用ctypes在python代碼中定義結構。

喜歡的東西:

>>> from ctypes import * 
>>> class Foo(Structure): 
...  _fields_ = [("size", c_size_t), ("buff", c_char_p)] 

應該做的伎倆。然後,您只需將get_version方法的restype設置爲您的結構,以便解釋程序知道它返回的內容,然後按預期方式使用它。

+0

感謝您的幫助,我讀過關於這個問題的其他帖子,但我仍然在爲此努力。我已在原始問題 – user1478497

+1

@ user1478497上添加更多信息您必須設置方法*的restype值,而不是整個dll。你也不應該把它指向'_fields_',而是它的結構本身,即'lib.get_version.restype = Foo'。最後你可能應該使用比foo更好的名字;) – Voo