我正在尝试使用Cython构建我的fisrt python扩展。
我的C文件在逻辑上是分区的,功能是“嵌套的” - 在该模块中,C依赖于模块B中定义的函数,然后依赖于模块A.
我发现很难理解如何对我的.pxd和.pyx文件进行分区,以便我可以维护功能模块之间的依赖关系。
以下片段希望能帮助澄清这种情况:
注意:文件FooBar.h包含一个CommonDefs.h文件,该文件声明通用数据类型并为这些常见类型(myArray和mySet)提供了一个简单的API。
我已经创建了ccommontypes.pxd和commontypes.pyx文件,用于导出在CommonDefs.h和CommonDefs.c中声明/定义的数据类型和函数。我能够从中成功编译一个python扩展模块。
我现在想要转到下一个阶段,即导出依赖于CommonDefs.h的数据类型和函数。但是,我发现我不得不重新声明类型
myArray和mySet(即使它们已经在ccommontypes.pxd中声明)
我似乎无法找到任何导入或包含这些声明,所以我不得不在下面的文件中重新声明它们,因为这些函数接受了myArray和mySet类型的参数。
问题1
重新声明这些类型是否可以重新声明,正如我在下面所做的,或者是否有任何我需要注意的陷阱?
//cfoobar.pxd
cdef extern from "../include/FooBar.h":
cdef struct FooBar:
pass
ctypedef struct myArray: // already declared elsewhere
pass
ctypedef struct mySet: // Already declared elsewher
pass
struct FooBar * foobar_new(mySet *s1)
//foobar.pyx
cimport cfoobar
cdef class FooBar:
cdef cfoobar.FooBar *_foobar
def __cinit__(self, myset):
_foobar = cfoobar.foobar_new(myset);
if (ret == 0):
raise MemoryError()问题2
从上面的FooBar ctor代码中,内存分配函数需要一个指向mySet变量的指针。但是,当我尝试编译此代码时,出现此错误:
无法将Python对象转换为'mySet *'
我理解错误信息,但由于Python不是静态类型的,我不知道如何指定数据类型。
我希望在解决这个问题上有所帮助。