我试图用Python创建一个用Cython编写的模块。该模块计划使用C++库来为不同的Python和Cython模块提供这些功能。
问题是。
(base) $ python setup.py build
Compiling queue/myqueue.pyx because it changed.
[1/1] Cythonizing queue/myqueue.pyx
Error compiling Cython file:
------------------------------------------------------------
...
# cython: language_level=3
from queue.myqueue import myclass
from queue.myqueue cimport myclass
cdef class myclass:
^
------------------------------------------------------------
queue/myqueue.pyx:6:5: C class 'myclass' is declared but not defined
Traceback (most recent call last):
File "setup.py", line 11, in <module>
setup(name="mymodule", ext_modules=cythonize([inumpy_queue]))
File "site-packages/Cython/Build/Dependencies.py", line 1096, in cythonize
cythonize_one(*args)
File "site-packages/Cython/Build/Dependencies.py", line 1219, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: queue/myqueue.pyx
我为原来的问题创建了一个小的再现器。
topdir:
setup.py
queue/
queue directory:
__init__.py
myqueue.pxd
myqueue.pyx
文件:setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
inumpy_queue = Extension(
name="myqueue",
sources=['queue/myqueue.pyx'],
language="c++"
)
setup(name="mymodule", ext_modules=cythonize([inumpy_queue]))
queue__init__.py
print("called __init__.py")
queuemyqueue.pxd
# cython: language_level=3
cdef class myclass:
cdef readonly int data
queuemyqueue.pyx
# cython: language_level=3
from queue.myqueue import myclass
from queue.myqueue cimport myclass
cdef class myclass:
def __init__(self, shape):
print("_____myclass::__init__()")
我做错了什么?
以下几行应该从queuemyqueue.pyx中删除。
from queue.myqueue import myclass
from queue.myqueue cimport myclass
cdef
类字段的声明应该在 pxd
文件。def
声明应以 pyx
仅限文件。pyx
和 pxd
文件代表一个Cython模块,那么就不需要导入cimport。pxd
变成 pyx
.
另外,在setup.py中,扩展名应该是 queue.myqueue
为了将Cython模块 myqueue
在文件夹中 queue
.
另外,我还用 pip install -e .
用于构建Cython模块。之后我就可以使用了。
from queue.myqueue import myclass
c = myclass(1)
这似乎与distutils有关。在命令行调用cythonize很好用。
在pyx中导入myqueue.myclass,不加包前缀就可以了。
from myqueue import myclass
from myqueue cimport myclass