Python3.11编写C++扩展遇ImportError:未定义PyInit_MyMath导出函数
解决Python C++扩展导入时的"dynamic module does not define module export function"错误
问题根源在于模块初始化函数名与setup.py中定义的模块名大小写不匹配:
- 你在setup.py里指定的模块名是
MyMath(首字母大写) - 但C++代码里的初始化函数是
PyInit_mymath(全小写)
Python 3要求扩展模块的初始化函数必须严格遵循PyInit_<模块名>的命名规则,且大小写完全一致,否则Python无法识别到导出函数。
两种解决方法:
方法1:修改C++代码,匹配setup.py的模块名
修改add.cpp中的模块定义和初始化函数名,与MyMath保持一致:
// 修改模块定义中的名称 static struct PyModuleDef mymath = { PyModuleDef_HEAD_INIT, "MyMath", // 改为和setup.py一致的模块名 NULL, -1, MathModuleMethods }; // 修改初始化函数名 PyMODINIT_FUNC PyInit_MyMath(void) { return PyModule_Create(&mymath); }
方法2:修改setup.py,匹配C++代码的命名(更推荐,符合Python模块命名规范)
Python模块名通常使用小写,将setup.py中的模块名改为mymath:
from setuptools import setup,Extension mm = 'mymath' # 改为小写 setup(name=mm,ext_modules=[Extension(mm,sources=['add.cpp'])])
之后导入模块时使用import mymath即可。
后续操作:
- 清理旧的编译文件:执行
python setup.py clean - 重新编译安装:执行
python setup.py develop - 确认生成的.so文件名与模块名一致(比如
mymath.cpython-311-x86_64-linux-gnu.so)
内容的提问来源于stack exchange,提问作者shadow
相关产品推荐
相关产品推荐

