2

创建 pxd 定义文件的最简单方法是什么,它只是收集通过 pyx 文件复制的 cdef,而不创建新的扩展名?

我的情况如下:我想在 pxd 文件 (hp/src/common.pxd) 中收集一些外部 cdef。我还添加了一些非外部 cdef,其实现在 common.pyx 中。

在另一个 pyx 文件(hp/src/_lib.pyx)中,我把它变成了一个扩展,我从 common 中导入了一些东西。

在 setup.py 文件中,我创建了以下扩展:

Extension('hp._lib', 
          ['hp/src/_lib.pyx'],
          language='c++'),

通过这样做,不会创建 common.cpp 文件,因此看起来依赖项不会自动处理。这是第一个问题。

然后,手动运行 'cython --cplus common.pyx' 在目录 hp/src 中正确创建一个 common.cpp 文件,如果我将 'hp/src/common.cpp' 添加到扩展源列表中,命令python setup.py 毫无怨言地安装了所有东西,但是,导入模块 hp 会触发 ImportError: No module named common... from _lib.cpp... 我被困在这里。任何想法?

4

2 回答 2

3

您可以使用该include语句包含来自另一个文件的材料。

请参阅此处的文档:

http://docs.cython.org/src/userguide/language_basics.html#the-include-statement

如果您有外部定义common.pxd和实现,commond.pyx则需要将它们都包括在内。例如,在_lib.pyx

include "common.pxd"
include "common.pyx"

然后,这些文件的内容将被编译到您的_lib模块中,就好像它们当时以文本形式包含在其中一样。即common.c不会生成文件,而是包含在_lib.c.

.c在决定是否需要重新生成模块文件时,Cython 编译器无法识别对包含的更改,因此请记住在重新编译之前将其删除。

于 2012-12-24T15:40:06.280 回答
0

如果您将 .pyx 和 .pxd 文件的结构与 .py 文件完全相同,那么您的运气会好得多。这包括在您的setup.py文件中为 common.pyx 创建一个扩展。您可能想尝试使用cythonize来处理依赖项。

于 2016-07-07T07:48:38.757 回答