ctypes - 将带有指针的结构传递给另一个结构

时间:2013-08-23 12:22:15

标签: python c dll ctypes

在我的C代码中,我有:

typedef struct{
    int info1;
    int info2;
    MoreData* md;
} BasicData;

typedef struct{
    int extinfo[100];
    char stuff[100];
} MoreData;

现在我有一个C库函数,它将BasicData作为参数,我想从Python调用它。 为此,我构建了一个ctypes类:

class BasicData(Structure):
    _fields_ = [("info1", c_int),
                ("info2", c_int),
                ("md", ??????)]

我的问题是我要填写什么?空间能够将此结构传递给C函数(或者我需要一些完全不同的东西?)。 MoreData只是在计算过程中使用,我不需要在我的Python代码中读取它,因此为它分配内存将从C库级别处理。我只需要传递一个具有正确指针类型的BasicData结构。

2 个答案:

答案 0 :(得分:2)

如果您不需要分配或使用MoreData结构,那么md就像ctypes而言只是一个通用指针。使用void * - 即c_void_p

答案 1 :(得分:1)

您需要定义包含其他结构的class MoreData(Structure)。然后将其传递为("md", POINTER(MoreData))

C保证struct字段按顺序分配,所以如果你真的不想从Python访问md那么你就不能在_fields_中指定它(因为它是最后的) 。然后ctypes会相信你有一个只有前两个成员的结构。

Ctypes可以一次性访问C结构,但是如果你经常用C语言将C代码绑在一起,那么我真的建议你查看Cython。

编辑:正如eryksun指出的那样(微弱的双关语),我忘记了指针。