尝试从其他包中 cimport pxd 定义。
简单的例子,一个.pxd文件:
cdef inline void a():
print "a"
Run Code Online (Sandbox Code Playgroud)
b.pyx 文件:
cimport a
def b():
a.a()
Run Code Online (Sandbox Code Playgroud)
到这里为止,一切正常,并且$ cython b.pyx可以正常工作。
如果我将 a.pxd 移动到一个文件夹,例如libs/,那么我将 b.pyx 更改为:
from libs cimport a
def b():
a.a()
Run Code Online (Sandbox Code Playgroud)
然后我有错误:
$ cython b.pyx
Error compiling Cython file:
------------------------------------------------------------
...
from libs cimport a
^
------------------------------------------------------------
b.pyx:1:0: 'a.pxd' not found
Error compiling Cython file:
------------------------------------------------------------
...
from libs cimport a
^
------------------------------------------------------------
b.pyx:1:0: 'libs/a.pxd' not found
Run Code Online (Sandbox Code Playgroud)
但是 libs/a.pxd 就在那里。从其他包导入 pxd 定义的正确方法是什么?
目录不是包,除非它包含__init__.py文件,即使文件是空的。所以__init__.py在libs目录中添加一个空文件。
有了这个目录结构,你的a.pxd和b.pyx,setup.py和script.py(下面),
% tree .
.
??? libs
? ??? a.pxd
? ??? __init__.py
??? b.c
??? b.pyx
??? b.so
??? build
? ??? temp.linux-x86_64-2.7
? ? ??? b.o
? ??? temp.linux-x86_64-3.4
? ??? b.o
??? script.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)
运行script.py作品:
% python setup.py build_ext --inplace
% python ./script.py
a
Run Code Online (Sandbox Code Playgroud)
设置.py:
# python setup.py build_ext --inplace
from distutils.core import setup
from Cython.Build import cythonize
setup(
name='test',
ext_modules=cythonize("b.pyx"),
)
Run Code Online (Sandbox Code Playgroud)
脚本.py:
import b
b.b()
Run Code Online (Sandbox Code Playgroud)