首页 > 解决方案 > 如何在 python 中使用 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 结构?

标签: pythoncctypes

解决方案


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

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

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

推荐阅读