我正在尝试围绕C库编写一个Cython包装器。我是Cython的新手,所以如果问题很明显,我会提前道歉。
在文件wrapper.pxd中,我定义了一个结构(简化示例):
cdef extern from "thiscouldbeyourlibrary.h":
cdef struct foo:
double **output
然后我有一个班级:
cdef class Bar:
cdef wrapper.foo __stuff
cdef do_something(self):
self.__stuff.output = NULL
这失败了:
无法将'void *'转换为Python对象。
显然,Cython不能确定self .__ stuff.output总是一个指针。但我宣布它的类型和类是一个“cdef”类,所以我不明白为什么。
答案 0 :(得分:1)
问题是NULL
和double **
之间不兼容。您可以将其分配给char
,int
或void *
,例如:
wrapper.pyd:
cdef extern from "thiscouldbeyourlibrary.h":
cdef struct foo:
char a
int b
void *c
double **output
thiscouldbeyourlibrary.h:
struct foo
{
char a;
int b;
void *c;
double **output;
};
main.pyx:
cimport wrapper
cdef class Bar:
cdef wrapper.foo __stuff
def __init__(self):
self.__stuff.a = <char>NULL
self.__stuff.b = <int>NULL
self.__stuff.c = NULL
def main():
bar = Bar()
print bar.__stuff.a
print bar.__stuff.b
如果您之前为output
分配了内存,则可以这样做:
self.__stuff.output[0] = NULL
没有分配就会崩溃......