如何使用cython定义文件(pxd)而不使其成为扩展名?

时间:2012-12-17 00:50:41

标签: cython distutils

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

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

在另一个pyx文件(hp / src / _lib.pyx)中,我将其转换为扩展名,我会从常见文件中提取一些内容。

在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:没有名为common的模块...来自_lib.cpp ... 我被困在这里有什么想法吗?

2 个答案:

答案 0 :(得分: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编译器无法识别包含的更改,因此请记住在重新编译之前删除它。

答案 1 :(得分:0)

如果您完全按照.py文件构建.pyx和.pxd文件,那么您将获得更好的运气。这包括在setup.py文件中为common.pyx制作扩展名。您可能希望尝试使用cythonize来处理依赖项。