Python Cython:C类';myclass';已声明但未定义
我试图用Python创建一个用Cython编写的模块。该模块计划使用C++库来提供给不同的Python和Cython模块。 问题是:Python Cython:C类';myclass';已声明但未定义,python,cython,cythonize,Python,Cython,Cythonize,我试图用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: --------------------------------------
(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
档案:
setup.py
队列/\uuuu init\uuuuu.py
print("called __init__.py")
队列/myqueue.pxd
# cython: language_level=3
cdef class myclass:
cdef readonly int data
queue/myqueue.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__()")
我做错了什么?
谢谢这似乎与distutils有关。在命令行上调用cythonize效果很好 在pyx中,导入不带包前缀的myqueue.myclass可以工作:
from myqueue import myclass
from myqueue cimport myclass
应从queue/myqueue.pyx中删除以下行:
from queue.myqueue import myclass
from queue.myqueue cimport myclass
cdef
类字段的声明只能在pxd
文件中。
def
声明只能在pyx
文件中。
由于您的pyx
和pxd
文件代表一个Cython模块,因此无需将/cimportpxd
导入pyx
另外,在setup.py中,扩展名应该是queue.myqueue
,以便将Cython模块myqueue
放入文件夹queue
另外,我使用pip安装-e.
构建Cython模块。之后,我可以使用:
from queue.myqueue import myclass
c = myclass(1)
我也有同样的问题。我不确定这是否是一个解决方案,但我删除了import语句,因为“pyx”和“pxd”文件都具有相同的名称,只是再次编译它们,结果成功了。此外,这可能会有所帮助-
from queue.myqueue import myclass
from queue.myqueue cimport myclass
from queue.myqueue import myclass
c = myclass(1)