2012-12-17 57 views
2

创建一个pxd定义文件最简单的方法是什么,它只是收集通过pyx文件复制的cdefs,而不创建新的扩展?如何在不使用扩展的情况下使用cython定义文件(pxd)?

我的情况如下:我想在pxd文件(hp/src/common.pxd)中收集一些extern cdefs。我还添加了一些非外部的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:No module common ... from _lib.cpp ... 我卡在这里。任何想法?

+0

您也可以尝试在[cython-users](https://groups.google.com/forum/#!forum/cython-users) – forivall

回答

2

您可以使用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编译器无法识别包含的更改,因此请记住在重新编译之前删除此文件。

0

如果将.pyx和.pxd文件与.py文件完全相同,那么你将会有更好的运气。这包括在您的setup.py文件中为common.pyx扩展。您可能想尝试使用cythonize来处理依赖关系。

相关问题