如何用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__.pxd
和cimport
通过pyx.Shrubbing
在扩展使用的名称,例如,你会与Python模块。
如果在python中导入(不是cimport
),__init__.py
也应该包含在内。
当在同一个模块中使用时,需要在该模块的运行时使用OTOH,.pxd
,这意味着将其包含在Python搜索路径中。
如果要将pxd文件组织为单独的目录,然后将它们链接到模块目录中以使它们可供模块使用,该目录包含__init__.pxd
或.py
文件。
由于Cython目前不支持相对导入,因此在想从另一个目录导入时需要进行链接,这有点麻烦。
我认为这是我正在寻找的答案,但是你是什么意思的'链接他们在模块目录'?这是一个'cimport'声明还是你的意思是一个符号链接? – ethanabrooks