如何在python中使用ctypes初始化和传递自引用结构?

时间:2019-05-12 15:55:17

标签: python c ctypes

我在C语言中具有以下结构:

struct Entry_t{
    char *key; 
    int data_type; 
    int nbitems; 
    size_t offset; 
    int size; 
    Entry_t *pcfg;
};

和C中的以下函数:(我最终想初始化该结构并将其从python传递给C)

int get_config(void *ctx, Entry_t* pconfig, void *pdest, char *key);

我在python中定义了相同的结构,如下所示:

class Entry_t(Structure): pass
Entry_t._fields_ = [
             ('key', c_char_p),
             ('data_type', c_int),
             ('nbitems', c_int),
             ('offset', c_size_t),
             ('size', c_int),
             ('pcfg', POINTER(Entry_t)),
    ]

testctx = Entry_t() //initialize with empty values

我创建了Entry_t实例,如下所示:

type = Entry_t("e",3,1,5,12,POINTER(testctx))

创建实例时出现此错误

TypeError: expected LP_Entry instance, got CArgObject

如何正确初始化我的entry_t结构?

1 个答案:

答案 0 :(得分:0)

type = Entry_t("e",3,1,5,12,POINTER(testctx))

当您将testctx传递给对象时,请使用pointer()函数(小写),因为大写变体用于描述结构而不是构造对象。另外,建议不要隐藏内置的Python函数,因此请考虑将变量从“类型”重命名为其他名称。

t1 = Entry_t("e", 3, 1, 5, 12, pointer(testctx))