您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python使用ctypes自定义结构调用C共享库

5b51 2022/1/14 8:23:27 python 字数 2698 阅读 629 来源 www.jb51.cc/python

我在 Linux系统上从 Python调用C共享库. 我遇到的问题是C库中的函数将一个指向结构的指针作为参数.然后mallocs内存为一个结构数组,用数据填充数组并返回.所以我把这个函数定义为 from ctypes import * class myStruct(Structure): _fields_ = [("id", c_uint), "name", c_char*256)] l

概述

我遇到的问题是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))

总结

以上是编程之家为你收集整理的Python使用ctypes自定义结构调用C共享库全部内容,希望文章能够帮你解决Python使用ctypes自定义结构调用C共享库所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶