使用Ctypes从Python传递C结构

时间:2013-03-26 21:40:18

标签: python ctypes

我试图在一个使用结构作为参数的C库中调用一个函数。我该怎么做呢?我已经创建了类似于文档中所做的结构的Ctypes表示,但我直接传递它不起作用。

我试图找到示例,但我发现的所有示例都是通过指向结构的指针。

2 个答案:

答案 0 :(得分:3)

在没有看到你的代码的情况下很难分辨,但我的猜测是你必须实例化结构。来自文档:

from ctypes import *

class POINT(Structure):
    _fields_ = [("x", c_int),
                ("y", c_int)]

point = POINT(10, 20)

最后一行创建了一个名为point的POINT结构实例。

如果您可以显示结构定义,如何使用它以及任何错误消息,那将非常有用

答案 1 :(得分:3)

我遇到了完全相同的问题。我有一个C libxxxx.so文件和相应的.h文件。这就对了。第一个.h文件中定义的几个函数原型需要传入堆栈上的结构。结构在第二个.h文件中定义。我查看了usb1 Python库包装器,每个结构都作为指向函数原型的指针传递。 (有些甚至是指针指针。)

我为这个结构创建了一个包装器:

typedef struct _SE_ADDR{
   int slot;   /**< The index of the target slot. */
   int fpga;   /**< The index of the target FPGA. */
   int reg;    /**< The index of the target register. */
} SE_ADDR;

在Python包装器模块中,我创建了一个类来表示这个结构:

class SE_ADDR(Structure):
    _fields_ = [('slot', c_int),
                ('fpga', c_int),
                ('reg', c_int)]

SE_ADDR_p = POINTER(SE_ADDR) #Pointer to SE_ADDR required for se_waitForData_new

然后在导入包装后我按照上面描述的@picomancer的方式使用它:

addr = wrapper.SE_ADDR(0,0,0)

这似乎有效。