【问题标题】:Cython: C class 'myclass' is declared but not definedCython:C 类“myclass”已声明但未定义
【发布时间】:2020-06-03 16:24:28
【问题描述】:

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

文件: 设置.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__()")

我做错了什么? 谢谢

【问题讨论】:

  • 我遇到了同样的问题。不确定这是否是一个解决方案,但我删除了导入语句,因为 'pyx' 和 'pxd' 文件都具有相同的名称,只是再次编译它们,它工作。此外,这可能会有所帮助 - stackoverflow.com/questions/13669961/…

标签: python cython cythonize


【解决方案1】:

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

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

cdef 类字段的声明只能在 pxd 文件中。 def 声明只能在 pyx 文件中。 由于您的pyxpxd 文件代表一个Cython 模块,因此没有必要将pxd 导入/cimport 到pyx

此外,在 setup.py 中,扩展名应为 queue.myqueue,以便将 Cython 模块 myqueue 放置在文件夹 queue 中。

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

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

【讨论】:

    【解决方案2】:

    这似乎与distutils有关。在命令行上调用 cythonize 效果很好。

    在没有包前缀的 pyx 中导入 myqueue.myclass 有效:

    from myqueue import myclass
    from myqueue cimport myclass
    

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      相关资源
      最近更新 更多