无参全局函数在Cython编译时报错的原因及解决方法
问题描述
我编写了如下Python无参函数:
############################## def queryPythonVersion() -> str: # <<<<<<<<<<<<<<<<< return '3.11'
Cython生成了对应的C代码:
/* "src/CnTestingTask.pyx":2 * ############################################################# CnTestingTask.pyx ############################# * def queryPythonVersion() -> str: # <<<<<<<<<<<<<<<<< * return '3.11' * */ __pyx_codeobj__1343 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_CnTestingTask_pyx, __pyx_n_s_queryPythonVersion, 2, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__1343)) __PYX_ERR(0, 2, __pyx_L1_error)
随后编译时出现如下警告与错误:
build_cythonize\src/CnXXX.c(1754397): warning C4047: 'function': 'PyObject *' 和 'int' 的间接级别不同 build_cythonize\src/CnXXX.c(1754397): warning C4024: 'PyCode_New': 形参和实参类型不同(参数14) build_cythonize\src/CnXXX.c(1754397): warning C4047: 'function': 'int' 和 'PyObject *' 的间接级别不同 build_cythonize\src/CnXXX.c(1754397): warning C4024: 'PyCode_New': 形参和实参类型不同(参数15) build_cythonize\src/CnXXX.c(1754397): error C2198: 'PyCodeObject *PyCode_New(int,int,int,int,int,PyObject *,PyObject *,PyObject *,PyObject *,PyObject *,PyObject *,PyObject *,PyObject *,PyObject *,int,PyObject *,PyObject *)': 函数参数不足
报错原因
核心是Cython版本与目标Python版本不兼容:
- Python 3.10及后续版本修改了
PyCode_New函数的签名,新增了参数,参数数量、类型都有变化。 - 你使用的Cython版本偏旧,生成的C代码仍沿用旧版Python的
PyCode_New调用格式,参数数量少于新版Python的要求,同时部分参数类型不匹配,直接触发编译报错和警告。
解决方法
- 升级Cython到对应兼容版本:比如Python 3.11需要Cython 0.29.28及以上版本,升级后Cython会根据目标Python版本生成正确的
PyCode_New调用代码,从根源解决参数不匹配问题。 - 确保编译环境Python版本一致:检查构建脚本(如
setup.py),保证编译时使用的Python解释器版本与目标运行版本完全一致,避免Cython基于错误的Python头文件生成代码。 - 临时兼容方案(不推荐):若暂时无法升级Cython,可以尝试移除函数的返回类型注解(
-> str),旧版Cython对类型注解的处理可能存在兼容性问题,但这只是临时 workaround,优先推荐升级Cython。
内容的提问来源于stack exchange,提问作者Farn Wang
相关产品推荐
相关产品推荐

