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结构。
如果您不需要分配或使用MoreData
结构,那么就ctypes而言, md
只是一个通用指针。 使用void *
– 即c_void_p
。
您需要定义包含其他结构的class MoreData(Structure)
。 然后将其传递为("md", POINTER(MoreData))
。
C保证struct字段按顺序分配,所以如果你真的不想从Python访问md
那么你就不能在_fields_
指定它(因为它是最后的)。 然后ctypes会相信你有一个只有前两个成员的结构。
Ctypes可以一次性访问C结构,但是如果你经常用C语言将C代码绑在一起,那么我真的建议你查看Cython。
编辑:正如eryksun指出的那样(微弱的双关语),我忘记了指针。