如何用Cython

问题描述:

指定路径`.pxd`文件

我的项目有以下目录结构:如何用Cython

. 
├── Makefile 
├── pxd 
├── pyx 
│   ├── Landscaping.pyx 
│   ├── Shrubbing.pxd 
│   └── Shrubbing.pyx 
└── setup.py 

但是,如果我移动Shrubbing.pxd其他地方,比方说,为pxd/,我得到以下错误:

Error compiling Cython file: 
------------------------------------------------------------ 
... 
import pyx.Shrubbing 
cimport Shrubbing 
    ^
------------------------------------------------------------ 

pyx/Landscaping.pyx:2:8: 'Shrubbing.pxd' not found 

Error compiling Cython file: 
------------------------------------------------------------ 
... 
import pyx.Shrubbing 
cimport Shrubbing 

cdef Shrubbing.Shrubbery sh 
    ^
------------------------------------------------------------ 

这很奇怪,因为在setup.py我:

from distutils.core import setup, Extension 
from Cython.Build import cythonize 
setup(ext_modules=cythonize([ 
    Extension(
     'pyx.Landscaping', 
     sources=["pyx/Landscaping.pyx"], 
     include_dirs=['pxd']), # <-- HERE 
    Extension('pyx.Shrubbing', sources=["pyx/Shrubbing.pyx"]) 
])) 

其中明确指定了Shrubbing.pxd的新目录。

源文件都非常短,但要避免混乱这篇文章中,我将只发布一个链接到资源库:https://github.com/lobachevzky/landscaping

感谢您的帮助。

include_dirs是用于C/C++头文件,而不是Cython pxd文件。

通常最好将相关的pyx/pxd文件放在同一个目录中,即Shrubbing.pyx和Shrubbing.pxd应该位于同一个目录中。

然后使用该从其他模块,包括__init__.pxdcimport通过pyx.Shrubbing在扩展使用的名称,例如,你会与Python模块。

如果在python中导入(不是cimport),__init__.py也应该包含在内。

当在同一个模块中使用时,需要在该模块的运行时使用OTOH,.pxd,这意味着将其包含在Python搜索路径中。

如果要将pxd文件组织为单独的目录,然后将它们链接到模块目录中以使它们可供模块使用,该目录包含__init__.pxd.py文件。

由于Cython目前不支持相对导入,因此在想从另一个目录导入时需要进行链接,这有点麻烦。

+0

我认为这是我正在寻找的答案,但是你是什么意思的'链接他们在模块目录'?这是一个'cimport'声明还是你的意思是一个符号链接? – ethanabrooks