在Python中使用共享库中的c结构和ctypes

在Python中使用共享库中的c结构和ctypes,python,c,data-structures,ctypes,Python,C,Data Structures,Ctypes,我做了很多研究,但什么都没发现。。。我不熟悉Python和Ctypes,我正在尝试从共享库调用函数。到目前为止还不错,但这些函数将.So中定义的结构中的特定数据类型作为参数 我的问题是,我已经看到了如何在Python中声明“类结构”的示例,但这就是我在.so typedef struct noPDDE { void *x; struct noPDDE *y; struct noPDDE *z; }NoPDDE,*pNoPDDE; typedef struct PD

我做了很多研究,但什么都没发现。。。我不熟悉Python和Ctypes,我正在尝试从共享库调用函数。到目前为止还不错,但这些函数将.So中定义的结构中的特定数据类型作为参数

我的问题是,我已经看到了如何在Python中声明“类结构”的示例,但这就是我在.so

typedef struct noPDDE
{
     void *x;
     struct noPDDE *y;
     struct noPDDE *z;
}NoPDDE,*pNoPDDE;

typedef struct PDDE
{
    int tam;
    pNoPDDE sup;
}PDDE;
我不知道如何将PDDE指针传递给函数


任何帮助都是有用的。非常感谢。

这是在ctypes中声明递归结构的方式:

 from ctypes import (
     Structure,
     c_void_p,
     POINTER,
     c_int,
     byref,
 )


 class noPDDE(Structure):
     pass

 noPDDE._fields_ = [
     ("x", c_void_p),
     ("y", POINTER(noPDDE)),
     ("z", POINTER(noPDDE)),
     ]


 class PDDE(Structure):
     _fields_ = [
         ("tam", c_int),
         ("sup", POINTER(noPDDE)),
         ]



 foo = PDDE()

 mylib.func_that_takes_pointer_to_pdde(byref(foo))

这是在ctypes中声明递归结构的方式:

 from ctypes import (
     Structure,
     c_void_p,
     POINTER,
     c_int,
     byref,
 )


 class noPDDE(Structure):
     pass

 noPDDE._fields_ = [
     ("x", c_void_p),
     ("y", POINTER(noPDDE)),
     ("z", POINTER(noPDDE)),
     ]


 class PDDE(Structure):
     _fields_ = [
         ("tam", c_int),
         ("sup", POINTER(noPDDE)),
         ]



 foo = PDDE()

 mylib.func_that_takes_pointer_to_pdde(byref(foo))

PDDE
是一个结构,而不是指针。您的意思是“将指针传递到PDDE结构”
PDDE
是结构,而不是指针。你是说“向PDDE结构传递指针”吗?我完全按照你写的做了,但这里仍然缺少一些东西。。第一个错误是“无法导入void\u p”,因此我使用了(“x”,c\u void\u p)。好啊现在,它告诉我PDDE类中字段的第二个元素必须是c类型…我犯了一个错误,因为我显然无法运行您的代码,因为缺少您的奇怪库,并更正了它。但是你需要自己解决类似的问题,错误信息非常清楚,关于ctypes结构的文档也很清楚。好的,非常感谢@deets!我不知道如何声明递归结构。我已经做了@deets,但我刚刚创建了我的帐户,我想我没有足够的声誉:/@eryksun-drat。你说得对。我确实创建了一个没有调用的简单示例,因为我可能没有一个真正有效的c-call。但我应该和派林核实一下。我完全按照你写的做了,但这里仍然缺少一些东西。。第一个错误是“无法导入void\u p”,因此我使用了(“x”,c\u void\u p)。好啊现在,它告诉我PDDE类中字段的第二个元素必须是c类型…我犯了一个错误,因为我显然无法运行您的代码,因为缺少您的奇怪库,并更正了它。但是你需要自己解决类似的问题,错误信息非常清楚,关于ctypes结构的文档也很清楚。好的,非常感谢@deets!我不知道如何声明递归结构。我已经做了@deets,但我刚刚创建了我的帐户,我想我没有足够的声誉:/@eryksun-drat。你说得对。我确实创建了一个没有调用的简单示例,因为我可能没有一个真正有效的c-call。但我应该和派林核实一下。