You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何跨文件调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:15:03