Python使用ctypes自定义结构调用C共享库
我在
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)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |