Cython向pyx文件导入class报错‘Bus’不是类型标识符,求解决建议
解决Cython中‘Bus’ is not a type identifier报错的方案
1. 确认bus.pxd的类声明规范
Bus类必须在bus.pxd中用Cython的cdef类语法声明,不能用普通Python类语法,否则无法作为静态类型被cimport识别:
# src/bus/bus.pxd cdef class Bus: # 声明类的方法/属性签名 cdef void some_method(self, int arg)
2. 修正cimport的路径语法
在src/cpu/cpu.pyx中,要根据包结构和pxd文件位置调整cimport语句:
- 如果
src是项目根目录,且bus是一个子包(需包含空的__init__.py文件),正确的cimport方式是:# src/cpu/cpu.pyx from bus.bus cimport Bus - 或者如果
bus.pxd直接在src/bus下,且setup.py已将src加入include路径,也可以用:
注意:不要直接写cimport bus.bus as Buscimport bus.Bus,这会被解析为从bus模块导入Bus子模块,而非从bus.pxd导入类。
3. 检查setup.py的配置正确性
确保setup.py中正确配置了Cython扩展的路径和依赖:
- 把
src目录加入include_dirs,让Cython能找到所有pxd文件:from setuptools import setup, Extension from Cython.Build import cythonize import os setup( ext_modules=cythonize([ Extension("bus.bus", ["src/bus/bus.pyx"]), Extension("cpu.cpu", ["src/cpu/cpu.pyx"]) ]), include_dirs=[os.path.abspath("src")] ) - 扩展模块的顺序要保证
bus.bus先于cpu.cpu编译,避免依赖未生成的类型。
4. 验证Cpu类中Bus类型的使用方式
在Cpu类中声明Bus成员或参数时,必须明确使用cdef类型:
# src/cpu/cpu.pyx from bus.bus cimport Bus cdef class Cpu: cdef Bus _bus # 用cdef声明静态类型成员 def __init__(self, Bus bus): # 参数也要指定Bus类型 self._bus = bus
5. 清理编译缓存后重新编译
之前的编译缓存可能导致类型识别异常,执行以下操作:
- 删除项目下的
build目录 - 删除所有生成的
.c、.so/.pyd文件 - 重新运行
python setup.py build_ext --inplace
内容的提问来源于stack exchange,提问作者Guy-Arieli
相关产品推荐
相关产品推荐

