我在
Linux系统上从
Python调用C共享库.
我遇到的问题是C库中的函数将一个指向结构的指针作为参数.然后mallocs内存为一个结构数组,用数据填充数组并返回.所以我把这个函数定义为
from ctypes import * class myStruct(Structure): _fields_ = [("id",c_uint),"name",c_char*256)] library.func.argtypes = [POINTER(myStruct)]
然后我这样称呼它:
Myfoo = myStruct Foo = pointer(Myfoo) Bar = library.func(Foo) for i in range(Bar): print("id = %u,name = %s" % (Foo[i].id,Foo[i].name))
Bar包含由func分配的结构数.
无论我做什么,我都无法从Foo中获取任何数据.几个月来,我尝试了多种不同的变体.我可以查看来自C库的日志,我知道它正在获取数据并返回它,但我似乎找不到从Python中提取数据的方法.
有什么想法吗?
解决方法
好吧,这只需要一些小的更新.
首先,您的参数声明已关闭,但这可能无关紧要.就python-c值转换机制而言,指针是指针.最精确的是POINTER(POINTER(myStruct)),但是为了简单起见,我们只需使用:
library.func.argtypes = [c_void_p]
接下来,您不需要为您的参数创建一个myStruct实例来指出;你只需要一个有效的指针,并指向它. func将分配实际的myStruct实例.那么让我们开始:
Foo = ctypes.POINTER(myStruct)()
现在我们可以称之为.我们有一个myStruct *,但是我们会传给它一个指针,所以func可以改变它.我们不需要构造一个完整的其他指针对象,所以我们将使用更轻的byref:
Bar = library.func(byref(Foo))
现在你可以迭代Foo [i]了.
for i in range(Bar): print("id = %u,Foo[i].name))