如何跨文件调用Cython中cdef类方法且不转为cpdef?
解决Cython跨模块调用cdef方法的AttributeError问题
问题原因
Cython中cdef定义的方法是仅在C编译级别可见的方法,不会暴露到Python的属性系统中。当你在model.pyx里直接用未声明C类型的变量调用change_myVal时,Python的属性查找机制找不到这个方法,因此抛出AttributeError。
解决方案(仅修改调用方model.pyx)
通过cimport导入模块的C级别定义,并明确声明变量的C类型,让Cython在编译阶段直接识别cdef方法:
修改后的model.pyx代码:
# 用cimport导入parameters模块的C级定义,而非普通import cimport parameters cpdef single_run(): # 明确声明变量为parameters.Parameters的C类型实例 cdef parameters.Parameters params = parameters.Parameters() params.change_myVal()
编译说明
确保你的setup.py同时编译两个文件,示例如下:
from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize(["parameters.pyx", "model.pyx"]) )
原理说明
cimport会导入Cython模块的C级别定义(即使没有显式编写.pxd文件,Cython也会自动生成临时定义),让调用方能够访问模块内的C级别类和方法。- 用
cdef声明变量类型后,Cython会跳过Python的属性查找流程,直接在C层面调用change_myVal方法,从而避免属性不存在的错误。
内容的提问来源于stack exchange,提问作者user58925
相关产品推荐
相关产品推荐

