首页 > 解决方案 > Cython:C 类“myclass”已声明但未定义

问题描述

我正在尝试在 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]))

队列/__init__.py

print("called __init__.py")

队列/myqueue.pxd

# cython: language_level=3
cdef class myclass:
    cdef readonly int data

队列/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__()")

我做错了什么?谢谢

标签: pythoncythoncythonize

解决方案


以下行应从 queue/myqueue.pyx 中删除:

from queue.myqueue import myclass
from queue.myqueue cimport myclass

cdef类字段的声明应该只在pxd文件中。 def声明应该只在pyx文件中。由于您的pyxpxd文件代表一个 Cython 模块,因此没有必要将 import/cimportpxdpyx.

此外,在 setup.py 扩展名中应该是queue.myqueue为了将 Cython 模块myqueue放在文件夹中queue

另外,我pip install -e .用于构建 Cython 模块。之后我可以使用:

from queue.myqueue import myclass
c = myclass(1)

推荐阅读