我的C函数的原型是:
typedef struct {
int a;
int b;
} foo_t;
foo_t* foo(int a);
在Python中,我必须重新定义我的结构:
class Foo(Structure):
_fields_ = [("a", c_int), ("b", c_int)]
我的问题是如何在Foo
中正确转换回报值?
>>> dll.foo.restype = POINTER(Foo)
>>> ret = dll.foo(42);
>>> print ret
<dll.LP_Foo object at 0xffe7c98c>
>>> print ret.a
AttributeError: 'LP_Foo' object has no attribute 'a'
我还尝试了Foo
而不是POINTER(Foo)
。有了这个,我可以访问Foo
成员,但值是错误的。
从ctypes我可以读到:
ctypes.POINTER(类型) 此工厂函数创建并返回新的ctypes指针类型。指针类型缓存在内部重用,因此重复调用此函数很便宜。 type必须是ctypes类型
所以类型不能是Foo
。我可能必须找到另一种方式。
答案 0 :(得分:6)
来自文档:
指针实例具有
contents
属性,该属性返回指针指向的对象
所以试试:
>>> print ret.contents.a
请注意文档说明:
请注意,ctypes没有OOR(原始对象返回),每次检索属性时都会构造一个新的等效对象