Cython运行报错:'Classes.Vec'对象无属性'i'该如何解决?
问题原因
该报错的核心是你当前使用的Cython扩展模块是未包含pxd声明的旧编译产物:
cdef class定义的Cython扩展类属性默认仅C层面可见,只有显式加了cdef public声明的属性才会暴露给Python调用层- 你已经在
Classes.pxd中正确声明了Vec的i,j,k为public属性,但编译环节没有读取到这份最新声明,导致生成的扩展类没有暴露对应属性
解决步骤
- 第一步:清理旧编译缓存
先删除当前目录下所有生成的中间产物:.c文件、.so(Linux/macOS)/.pyd(Windows)扩展文件、.pyxbuild临时目录,同时删除pyximport全局缓存(默认路径为~/.pyxbld,Windows下为C:\Users\你的用户名\.pyxbld) - 第二步:使用
setup.py编译扩展(稳定性高于pyximport,不会漏pxd依赖)
在代码目录新建setup.py,内容如下:
执行编译命令完成扩展生成:from setuptools import setup from Cython.Build import cythonize setup( ext_modules = cythonize("Classes.pyx", language_level=3) )python setup.py build_ext --inplace - 第三步:验证调用
编译完成后再执行你的调用代码即可正常运行。如果坚持要使用pyximport调试,可修改调用代码的导入逻辑,开启重载支持:
每次修改import pyximport; pyximport.install(reload_support=True)pxd文件后,手动修改一下pyx文件(比如加一行空行)触发pyximport的重新编译即可。
内容的提问来源于stack exchange,提问作者suzanne
相关产品推荐
相关产品推荐

