python - 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__()")
我做错了什么?谢谢
解决方案
以下行应从 queue/myqueue.pyx 中删除:
from queue.myqueue import myclass
from queue.myqueue cimport myclass
cdef
类字段的声明应该只在pxd
文件中。
def
声明应该只在pyx
文件中。由于您的pyx
和pxd
文件代表一个 Cython 模块,因此没有必要将 import/cimportpxd
到pyx
.
此外,在 setup.py 扩展名中应该是queue.myqueue
为了将 Cython 模块myqueue
放在文件夹中queue
。
另外,我pip install -e .
用于构建 Cython 模块。之后我可以使用:
from queue.myqueue import myclass
c = myclass(1)
推荐阅读
- matlab - Matlab可以标记一个轴不是从零开始吗?
- javascript - 我的 octacon 出现在字段顶部而不是旁边
- reactjs - 如何将 Github GraphQL API 提交响应映射到 react-bootstrap Cards?
- excel - 如果满足条件VBA,将部分单元格提取到另一个单元格
- sql - 如何从不同的表中查询两列序列之间的差异
- jquery - 表单未在 jQuery 中使用 submit() 方法提交
- python -
问题 - azure - 通过 Microsoft Graph API 创建共享邮箱和通讯组列表
- c - VS 看不到标准的包含文件
- matlab - Matlab:如何在不连续呈现相同试验的情况下随机化试验