处理从python调用的c ++返回的结构

时间:2012-06-24 21:14:41

标签: python ctypes

我想使用Python中的DLL定义的函数。 从C ++函数(get_version)返回的值是struct

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

Python代码是:

lib = CDLL(myDLL.dll)
lib.get_version

问题是如何处理返回的值?

我已经阅读了Voo的回答并阅读其他帖子,但我仍然在努力解决这个问题

我声明了结构类(Foo,来自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_

我收到以下错误 TypeError:restype必须是类型,可调用或无

我读到了这个,如果我将restype设置为不是列表,例如:c_char_p,则不会出现错误

当我设置restype

lib.restype = Foo。 fields

但未显示错误,但restype的{​​{1}}未正确设置 在debug中查看变量时:

lib.restype = list:[('size',),('buff',)]

lib.get_version.restype = PyCSimpleType:

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

您必须使用ctypes模块。您只需要使用ctypes在python代码中定义结构。

类似的东西:

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

应该做的伎俩。然后,您只需将restype方法的get_version设置为结构,以便解释器知道它返回的内容,然后您可以按预期使用它。