如何包含来自另一个文件的 cython 代码
Posted
技术标签:
【中文标题】如何包含来自另一个文件的 cython 代码【英文标题】:How to include cython code from another file 【发布时间】:2017-12-11 22:55:35 【问题描述】:我想包含一个文件中的代码以在另一个文件中使用,就像导入一个模块一样,但我不想编译第一个文件来这样做。
我的项目管道如下所示:
文件A这样定义扩展类型对象:
cdef class Thing(object):
...
这种文件会有很多不同的版本,每个版本都定义了一个名为“Thing”的类。
文件 B 使用类“Thing”完成所有类型的整洁工作,但没有在文件 B 中定义它,因为文件 B 能够对文件 A 中定义的许多不同类型的称为“事物”的对象执行一般操作。
例如
cdef int do_cool_stuff(Thing a, Thing b):
...
基本上。我可以将文件 B 中的代码复制粘贴到每个文件 A 中,它都会正常工作。但我想更好地组织我的项目,这两种类型的文件执行非常不同的任务,我希望混合和匹配这些任务。
有什么建议吗?
另外,如果能做这样的事情就好了:
在文件 A 中:
ctypedef ... newtype
在文件 B 中:
cdef newtype...
如果有帮助,newtype 将与 double 非常相似,但可能携带更多信息。我将重载比较运算符 、== 等,但我希望 newtype 携带比双精度更多的信息。
编辑:我将添加更多信息,因为似乎大多数读者都觉得这个问题比它更琐碎。
我有几个很长的程序,文件都可以分成两个不同的部分,每个部分的后半部分在代码方面都是相同的,但它们都使用在第一部分中定义的类型。第二部分不能独立存在,因为它依赖于第一部分中的 ctypedef 语句。
所以我想要的是: 文件1:
cdef class Thing:...
文件2:
stuff(Thing one, Thing two)
文件3:
import file1
import file2
并编译 file3,文件 1 和 2 未编译。
如果我制作 file1 和 file2 .pxd 文件并使用 cimport,我会收到有关 def
不允许使用的投诉以及所有 cdef
语句必须内联的投诉。如果我将 import 与 .py 文件一起使用,编译器会抱怨 file1
不是 cimported 模块。
为什么 cython 坚持以比我的主文件更严格的方式格式化我的头文件?我本质上想避免将 file2 复制粘贴到我的主文件中,最好编写一次并导入它,但我似乎无法找到任何可以帮助我完成此操作的文档。
【问题讨论】:
这真的在文档中:cython.readthedocs.io/en/latest/src/userguide/… 我不同意,如果没有文件 A 中的信息,我无法编译文件 B,我想做的是:写入文件 A 和 B,将它们导入文件 C 和编译。听起来像是一项简单的任务,但我所做的一切都不起作用。 我对问题进行了编辑,以更具体地说明为什么文档没有解释在我的情况下该怎么做。 我有一个似乎在任何地方都没有得到回答的问题是:在 C 中,有一些头文件不需要在被包含到更广泛的项目之前进行编译。是否有 Cython 等价物?如果我的 pyx 文件在不包含其他头文件的情况下无法自行编译,我可以像在 C 中那样将它们导入另一个项目吗? 听起来你想要的只是一个文本包含 cython.readthedocs.io/en/latest/src/userguide/… - 这不是真的推荐(这是一种旧的做事方式)但它可能适合你的使用 【参考方案1】:正如 DavidW 在 cmets 中提到的,我可能正在寻找的是
include "filename.pxi"
命令。这表明计划草率。最佳编码实践是创建 .pxd 和 .pyx 文件来扩充主 .pyx 文件。
【讨论】:
以上是关于如何包含来自另一个文件的 cython 代码的主要内容,如果未能解决你的问题,请参考以下文章