编译 Cython 文件时出错:在包中找不到 pxd
Error compiling Cython file: pxd not found in package
正在尝试从其他包导入 pxd 定义。
简单示例,a.pxd 文件:
cdef inline void a():
print "a"
b.pyx 文件:
cimport a
def b():
a.a()
到这里为止,一切正常,并且$ cython b.pyx
有效。
如果我将 a.pxd 移动到文件夹,例如 libs/
,然后我将 b.pyx 更改为:
from libs cimport a
def b():
a.a()
然后出现错误:
$ 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
但是 libs/a.pxd 在那里。
从其他包导入 pxd 定义的正确方法是什么?
A directory is not a package unless it contains a __init__.py
file,即使文件为空。所以添加一个空的__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
运行 script.py
有效:
% python setup.py build_ext --inplace
% python ./script.py
a
setup.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"),
)
script.py:
import b
b.b()
正在尝试从其他包导入 pxd 定义。
简单示例,a.pxd 文件:
cdef inline void a():
print "a"
b.pyx 文件:
cimport a
def b():
a.a()
到这里为止,一切正常,并且$ cython b.pyx
有效。
如果我将 a.pxd 移动到文件夹,例如 libs/
,然后我将 b.pyx 更改为:
from libs cimport a
def b():
a.a()
然后出现错误:
$ 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
但是 libs/a.pxd 在那里。 从其他包导入 pxd 定义的正确方法是什么?
A directory is not a package unless it contains a __init__.py
file,即使文件为空。所以添加一个空的__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
运行 script.py
有效:
% python setup.py build_ext --inplace
% python ./script.py
a
setup.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"),
)
script.py:
import b
b.b()