Cython编译报错:动态模块未定义PyInit_cython_helpers函数求助
Cython编译后导入报错:dynamic module does not define module export function (PyInit_cython_helpers)
问题重现
涉及文件内容
- cython_helpers.pyx
cdef public void initcython_helpers(): pass def func_cython_wrapper(list a): return func_cython(a) cpdef func_cython(list a): cdef int i cdef int j for i in range(len(a)): j += i return j
- setup.py
from distutils.core import setup, Extension from Cython.Build import cythonize ext = Extension("cython_helpers", sources=["cython_helpers.pyx"]) setup( name="cython_helpers", ext_modules=cythonize(ext, language_level=3), )
- test_cython.py
import cython_helpers my_list = [1, 2, 3] a = cython_helpers.func_cython_wrapper(my_list) print(a)
执行命令与报错
执行编译命令:
python3 setup.py build_ext --inplace
编译输出无异常,但运行test_cython.py时出现错误:
ImportError: dynamic module does not define module export function (PyInit_cython_helpers)
问题原因
- 模块初始化函数不兼容Python 3:手动定义的
initcython_helpers()是Python 2时代的模块初始化格式,Python 3要求C扩展模块必须以PyInit_<模块名>作为入口函数,这个手动定义的函数干扰了Cython自动生成符合Python 3标准的入口函数。 - 变量未初始化:
func_cython里的j没有初始值,会导致未定义的计算结果(虽非本次报错直接原因,但会引发运行时问题)。
解决方案
修正cython_helpers.pyx
移除过时的Python 2风格初始化函数,同时初始化变量j:
def func_cython_wrapper(list a): return func_cython(a) cpdef func_cython(list a): cdef int i cdef int j = 0 # 初始化j为0 for i in range(len(a)): j += i return j
重新编译并测试
- 清理之前的编译产物(可选,确保生成干净文件):
rm -rf build/ cython_helpers.c cython_helpers.cpython-39-darwin.so
- 重新编译:
python3 setup.py build_ext --inplace
- 运行测试脚本:
python3 test_cython.py
此时会输出正确结果3(0+1+2=3),导入报错同时消失。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

