在Cython中调用返回不透明结构体的C函数遇None问题及类型问询
问题解答
问题1:为什么得到None?
你得到None完全是因为Cython里的函数声明错误——你把myCfunction声明成了void类型,Cython会自动将C语言中返回void的函数映射为Python的None。这和原C函数实际有没有返回值无关,原函数确实返回结构体指针,但你的错误声明让Cython丢弃了这个返回值,只返回None给Python。
问题2:不知结构体成员时该用什么返回类型?
既然你不需要访问结构体内部数据,只需要传递指针,直接用不透明指针处理就行,不需要知道结构体的具体成员。具体操作如下:
- 在Cython的
.pyx文件中正确声明不透明结构体和函数:
cdef extern from "myClib.h": # 空的结构体声明,告诉Cython这是一个不透明类型 ctypedef struct myCStruct: pass # 正确声明myCfunction的返回类型为结构体指针 myCStruct* myCfunction() # 同时声明需要接收该指针的其他C函数(示例) void myOtherCFunction(myCStruct* struct_ptr)
- 封装Python可调用的函数:
def py_myCfunction(): cdef myCStruct* struct_ptr = myCfunction() # Cython会自动把这个不透明指针包装成Python对象返回 return struct_ptr def py_myOtherCFunction(struct_obj): # 接收之前返回的对象,转换回C指针后调用C函数 cdef myCStruct* struct_ptr = <myCStruct*>struct_obj myOtherCFunction(struct_ptr)
这样处理后,py_myCfunction返回的对象可以直接传递给其他封装的C函数,完全不需要关心结构体内部的具体成员。
内容的提问来源于stack exchange,提问作者bloub
相关产品推荐
相关产品推荐

