使用ctypes返回指向结构的指针的函数

时间:2015-09-03 08:42:57

标签: python ctypes

我的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。我可能必须找到另一种方式。

1 个答案:

答案 0 :(得分:6)

来自文档:

  

指针实例具有contents属性,该属性返回指针指向的对象

所以试试:

>>> print ret.contents.a

请注意文档说明:

  

请注意,ctypes没有OOR(原始对象返回),每次检索属性时都会构造一个新的等效对象