编译 Cython 文件时出错:在包中找不到 pxd

And*_*son 9 cython

尝试从其他包中 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 定义的正确方法是什么?

unu*_*tbu 9

目录不是包,除非它包含__init__.py文件,即使文件是空的。所以__init__.pylibs目录中添加一个空文件。


有了这个目录结构,你的a.pxdb.pyxsetup.pyscript.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)