如何包含来自另一个文件的 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 代码的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何构建包含 Cython 代码的 Python 包

使用 Cython 向另一个应用程序公开功能

在 Cython 中调用点积和线性代数运算?

包含来自另一个文件的数组(nodejs)

如何包含来自同一项目的另一个文件的模块?

使用 Cython 时如何将一个 C++ 类(引用)传递给另一个?