1

我正在尝试使用 Cython 构建我的第一个 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 不是静态类型的,我不知道如何指定数据类型。

我将不胜感激有关解决此问题的一些帮助。

4

1 回答 1

0

我在尝试自己解决 pxds 中的重新声明问题时遇到了这个问题......我相信一定有一些“陷阱”,但我不会冒险说出它们是什么。:)

但是对于问题 2:python 是动态类型的,但 cython 不是......只是没有类型的变量被静态类型为 python 对象。

你可以改变:

def __cinit__(self, myset):

至:

def __cinit__(self, mySet *myset):

如果你真的在传递一个指向 myset 的指针......

于 2012-04-29T23:28:17.890 回答