如何为Cython创建具有依赖项的单独文件以及如何修复编译错误:无法将Python对象转换为';mySet*';

如何为Cython创建具有依赖项的单独文件以及如何修复编译错误:无法将Python对象转换为';mySet*';,python,cython,python-extensions,Python,Cython,Python Extensions,我正在尝试使用Cython构建我的第一个python扩展 我的C文件是逻辑分区的,功能是“嵌套的”——模块C依赖于模块B中定义的功能,而模块B则依赖于模块A 我发现很难理解如何对.pxd和.pyx文件进行分区,以便维护功能模块之间的依赖性 希望以下片段有助于澄清这种情况: 注意:FooBar.h文件包含一个CommonDefs.h文件,该文件声明了常见的数据类型,并为这些常见类型(myArray和mySet)提供了一个简单的API 我已经创建了ccomontypes.pxd和commontype

我正在尝试使用Cython构建我的第一个python扩展

我的C文件是逻辑分区的,功能是“嵌套的”——模块C依赖于模块B中定义的功能,而模块B则依赖于模块A

我发现很难理解如何对.pxd和.pyx文件进行分区,以便维护功能模块之间的依赖性

希望以下片段有助于澄清这种情况:

注意:FooBar.h文件包含一个CommonDefs.h文件,该文件声明了常见的数据类型,并为这些常见类型(myArray和mySet)提供了一个简单的API

我已经创建了ccomontypes.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不是静态类型,我不知道如何指定数据类型


我希望能得到一些帮助来解决这个问题。

我自己在试图解决PXD中的重新声明问题时遇到了这个问题……我相信肯定有一些“问题”,但我现在不敢说它们是什么。:)

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

您可以更改:

def __cinit__(self, myset):
致:

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

def __cinit__(self, mySet *myset):