调试模式下运行嵌入Python的C++程序遇numpy导入错误求助
问题
我尝试在调试模式下运行下述C++嵌入Python的代码(Release模式可正常运行)。已链接从cpython3.10源码编译得到的python310_d.lib和python310_d.dll,并手动将其放入C:\Users\rizzo\AppData\Local\Programs\Python\Python310及\libs目录。目前使用虚拟环境中的python.exe,理论上应能自动检测库文件。
代码如下:
#define PY_SSIZE_T_CLEAN #include <Python.h> #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <locale> #include <codecvt> int main(){ PyConfig config; PyConfig_InitIsolatedConfig(&config); auto venv_executable = L"C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\Scripts\\python.exe"; PyConfig_SetString(&config, &config.executable, venv_executable); auto status = Py_InitializeFromConfig(&config); PyConfig_Clear(&config); if (PyStatus_Exception(status)) { std::cout << "status.func: " << (status.func ? status.func : "N/A") << '\n'; std::cout << "status.err_msg: " << (status.err_msg ? status.err_msg : "N/A") << '\n'; } PyRun_SimpleString("import numpy; print(\"Hello World! :33333\")"); return 0; }
运行时出现如下错误:
回溯(最近的调用最后): 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\__init__.py", 第23行, in <module> from . import multiarray 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\multiarray.py", 第10行, in <module> from . import overrides 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\overrides.py", 第8行, in <module> from numpy._core._multiarray_umath import ( ModuleNotFoundError: 找不到名为 'numpy._core._multiarray_umath' 的模块 在处理上述异常期间,发生了另一个异常: 回溯(最近的调用最后): 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\__init__.py", 第128行, in <module> from numpy.__config__ import show as show_config 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\__config__.py", 第4行, in <module> from numpy._core._multiarray_umath import ( 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\_core\__init__.py", 第49行, in <module> raise ImportError(msg) ImportError: 重要提示:请阅读以下内容以获取解决此问题的建议! 导入NumPy的C扩展失败。此错误可能由多种原因导致,通常与你的设置或NumPy的安装方式有关。 我们整理了一些常见原因和故障排除技巧,请参考NumPy官方文档。 请注意并检查以下内容: * Python版本:Python3.10,来自 "C:\Users\rizzo\Desktop\TESI\MMM_env\Scripts\python.exe" * NumPy版本:"2.1.1" 请确保它们是你预期的版本。请仔细研究官方文档以获取进一步帮助。 原始错误是:找不到名为 'numpy._core._multiarray_umath' 的模块 上述异常是以下异常的直接原因: 回溯(最近的调用最后): 文件 "<string>", 第1行, in <module> 文件 "C:\Users\rizzo\Desktop\TESI\MMM_env\lib\site-packages\numpy\__init__.py", 第133行, in <module> raise ImportError(msg) from e ImportError: 导入NumPy出错:你不应从其源码目录导入NumPy;请退出NumPy源码树,然后从那里重新启动Python解释器。 C:\Users\rizzo\Desktop\TESI\dependencies_test\build\Debug\python_cpp.exe (进程 15864) 已退出,代码为 0 (0x0)。 若要在调试停止时自动关闭控制台,请启用“工具->选项->调试->调试停止时自动关闭控制台”。 按任意键关闭此窗口...
请问有解决思路吗?
解决思路
- 调试版Python与Release版NumPy不兼容:你使用的是调试版
python310_d.dll,但虚拟环境中的NumPy是针对Release版Python编译的C扩展(_multiarray_umath.pyd这类文件为Release版本)。调试版Python无法加载Release版的C扩展模块,这是核心问题。解决方向二选一:要么给虚拟环境安装调试版NumPy,要么改用Release版Python库编译你的C程序(同时开启C项目的调试信息,不影响调试流程)。 - 手动确认模块路径:调试版Python可能无法自动识别虚拟环境的
site-packages路径,可在Py_InitializeFromConfig之后添加代码手动添加路径:PyRun_SimpleString("import sys; sys.path.append('C:\\Users\\rizzo\\Desktop\\TESI\\MMM_env\\lib\\site-packages')"); - 匹配编译配置:确保你编译cpython3.10时的配置与虚拟环境Python完全一致(比如同为64位、使用相同版本的MSVC编译器),配置不匹配会导致C扩展加载失败。
- 编译调试版NumPy:如果坚持使用调试版Python,需要从NumPy源码编译调试版本。编译时使用调试版Python执行编译脚本,比如用
python_d.exe运行NumPy的setup.py,确保生成的C扩展是调试兼容版本。 - 检查文件完整性与权限:确认
python310_d.dll能被程序正确加载,虚拟环境中NumPy的_multiarray_umath.pyd文件存在且未损坏,同时检查程序调试时的工作目录是否正确,避免路径解析错误。
内容的提问来源于stack exchange,提问作者Davide Rizzotti
相关产品推荐
相关产品推荐

