Cython.C类的'myclass'被声明但没有定义。C类 "myclass "被声明但没有定义

问题描述 投票:1回答:1

我试图用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__()")

我做错了什么?

python cython cythonize
1个回答
1
投票

以下几行应该从queuemyqueue.pyx中删除。

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

cdef 类字段的声明应该在 pxd 文件。def 声明应以 pyx 仅限文件。pyxpxd 文件代表一个Cython模块,那么就不需要导入cimport。pxd 变成 pyx.

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

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

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

0
投票

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

在pyx中导入myqueue.myclass,不加包前缀就可以了。

from myqueue import myclass
from myqueue cimport myclass
© www.soinside.com 2019 - 2024. All rights reserved.