如何从另一个文件中包含cython代码

时间:2017-12-11 22:55:35

标签: python cython

我想在文件中包含代码以便在另一个文件中使用,就像导入模块一样,但我不想编译第一个文件。

我的项目管道看起来像这样:

文件A定义了一个扩展类型对象:

cdef class Thing(object):
    ...

这种文件会有很多不同版本,每一个都定义一个名为" Thing"的类。

文件B使用类" Thing"来完成所有类型的整洁东西。但是没有在文件B中定义它,因为文件B能够对称为" thing"的许多不同类型的对象执行一般操作。在文件A中定义。

e.g。

cdef int do_cool_stuff(Thing a, Thing b):
    ...

基本上。我可以将文件B中的代码复制粘贴到每个文件A中,它们都能正常工作。但我想更好地组织我的项目,这两种类型的文件执行非常不同的任务,我希望混合和匹配这些任务。

有什么建议吗?

此外,能够做到这样的事情会很好:

文件A中的

ctypedef ... newtype

并在文件B中:

cdef newtype...

如果有帮助,newtype将非常类似于double,但可能会包含更多信息。我将重载比较运算符<,>,==等,但我希望newtype携带的信息多于double。

编辑:我会添加更多信息,因为似乎大多数读者认为这个问题比现在更简单。

我有几个非常长的程序,文件可以全部分成两个不同的部分,每个部分的后半部分在代码方面是相同的,但它们都使用第一部分中定义的类型。第二部分不能独立存在,因为它取决于第一部分中的ctypedef语句。

所以我想要的是: 文件1:

cdef class Thing:...

file2:

stuff(Thing one, Thing two)

file3的:

import file1
import file2

并编译file3,文件1和2未编译。

如果我制作file1和file2 .pxd文件并使用cimport,我会收到关于def语句不允许的投诉,并且必须内联所有cdef语句。如果我使用带有.py文件的import,编译器会抱怨file1不是一个cimported模块。

为什么cython坚持认为我的头文件的格式比我的主文件更加严格?我本质上想避免将file2复制粘贴到我的主文件中,编写一次并导入它会很好,但我似乎无法找到任何可以帮助我完成此操作的文档。

1 个答案:

答案 0 :(得分:1)

正如DavidW在评论中提到的,我可能正在寻找的是

include "filename.pxi"

命令。这表明了草率的规划。最好的编码实践是创建.pxd和.pyx文件来扩充主.pyx文件。