Qt Creator调用Python.h执行Python文件遇编码初始化致命错误
问题描述
在Qt Creator的C++项目中调用Python 3.11脚本时出现崩溃,错误提示为:
init_fs_encoding: failed to get the Python codec of the filesystem encoding
找不到'encodings'模块
调试发现PYTHONHOME被指向Qt MinGW安装包自带的Python路径,而非手动安装的Python 3.11路径。已在.pro文件中添加以下配置:
INCLUDEPATH += "C:\Users\(name)\AppData\Local\Programs\Python\Python311\include" LIBS += -L"C:\Users\(name)\AppData\Local\Programs\Python\Python311\libs" -l"python311"
并在mainwindow.cpp中编写调用代码:
FILE* fp; const char* file = "C:/(absolute path)/(filename).py"; Py_Initialize(); fp = fopen(file, "r"); PyRun_SimpleFile(fp, file); Py_Finalize();
尝试调整系统环境变量PYTHONPATH和PYTHONHOME后问题仍未解决。
解决方案
以下是几种直接有效的解决方法,按优先级尝试:
1. 在代码中显式设置Python路径
在调用Py_Initialize()之前,手动指定PYTHONHOME和PYTHONPATH,强制覆盖Qt自带的路径:
#include <cstdlib> // 用于setenv函数 // 设置PYTHONHOME为Python 3.11的安装根目录 setenv("PYTHONHOME", "C:\\Users\\(name)\\AppData\\Local\\Programs\\Python\\Python311", 1); // 设置PYTHONPATH,包含Python的核心库和第三方包目录 setenv("PYTHONPATH", "C:\\Users\\(name)\\AppData\\Local\\Programs\\Python\\Python311\\Lib;C:\\Users\\(name)\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages", 1); Py_Initialize(); // 后续调用Python脚本的代码...
注意:路径中的反斜杠需转义为\\,最后一个参数1表示覆盖已存在的环境变量。
2. 在Qt Creator项目运行配置中设置环境变量
无需修改代码,直接为当前项目单独配置环境变量:
- 打开项目的运行设置(左侧面板「Projects」→「Run」)
- 在「Environment」区域点击「Add」,添加两个变量:
- 变量名:
PYTHONHOME,值:C:\Users\(name)\AppData\Local\Programs\Python\Python311 - 变量名:
PYTHONPATH,值:C:\Users\(name)\AppData\Local\Programs\Python\Python311\Lib;C:\Users\(name)\AppData\Local\Programs\Python\Python311\Lib\site-packages
- 变量名:
- 保存配置后重新运行项目
3. 解决Qt MinGW环境的库冲突
如果前两种方法无效,可能是Qt的MinGW环境自带的Python库被优先加载:
- 确认项目构建时链接的是Python 3.11的
python311.lib(调试版本用python311_d.lib) - 复制Python 3.11安装目录下的
python311.dll到C++项目的输出目录(比如debug或release文件夹),确保程序运行时加载正确的DLL
4. 修正代码中的潜在错误
原代码未检查fopen的返回值,建议添加错误处理避免崩溃:
FILE* fp = fopen(file, "r"); if (!fp) { qDebug() << "无法打开Python文件:" << file; Py_Finalize(); return; }
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

