在MSYS2中嵌入Python遇“No module named encodings”错误求解决
解决MSYS2 MinGW64环境下C++嵌入Python启动时的编码模块缺失问题
问题背景
在Windows 10环境中,通过MSYS2的MinGW64套件(GCC+CMake+Ninja)构建嵌入Python 3.10的C++程序,编译成功但运行时抛出以下错误:
Could not find platform independent libraries <prefix> Could not find platform dependent libraries <exec_prefix> ... Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding ModuleNotFoundError: No module named 'encodings'
且错误设置PYTHONHOME为C:\msys64\mingw64\bin后,系统中原本正常的python命令也失效。
核心原因
PYTHONHOME路径设置错误:应指向Python的根安装目录(C:\msys64\mingw64),而非bin子目录- Windows系统环境与MSYS2 MinGW64环境的路径识别差异,导致Python无法正确定位核心模块
解决步骤
1. 修正系统环境变量
- 打开Windows系统环境变量设置:
- 删除错误的
PYTHONHOME值,重新设置为:C:\msys64\mingw64 - 确保
C:\msys64\mingw64\bin位于Path环境变量的最前端(避免与其他潜在的Python版本冲突)
- 删除错误的
- 重启CLion、命令提示符等所有相关程序,使环境变量生效
2. 优化CMake配置(可选,提升可靠性)
修改CMakeLists.txt,显式指定Python根目录,避免CMake自动检测时出现误判:
cmake_minimum_required(VERSION 3.26) project(python_test) set(CMAKE_CXX_STANDARD 17) # 显式指定Python 3.10的根目录 set(Python_ROOT_DIR "C:/msys64/mingw64") find_package(Python 3.10 REQUIRED Development) add_executable(python_test main.cpp) target_link_libraries(python_test PRIVATE Python::Python) # 可选:通过编译定义强制指定PYTHONHOME target_compile_definitions(python_test PRIVATE PYTHONHOME="C:/msys64/mingw64")
3. 代码中手动指定路径(备用方案)
若环境变量仍未生效,可在Py_Initialize()前手动设置Python的环境变量:
#include <Python.h> #include <cstdlib> int main() { // 设置PYTHONHOME为Python根目录 setenv("PYTHONHOME", "C:/msys64/mingw64", 1); // 添加Python核心模块及第三方库路径 setenv("PYTHONPATH", "C:/msys64/mingw64/lib/python3.10;C:/msys64/mingw64/lib/python3.10/site-packages", 1); Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "import numpy as np\n" "print('Today is', ctime(time()))\n"); if (Py_FinalizeEx() < 0) exit(120); return 0; }
4. 确保运行环境一致性
优先在MSYS2 MinGW64控制台中运行编译后的程序,该环境会自动加载MSYS2的原生环境变量,避免Windows系统环境的路径干扰。
验证
运行程序后,若能正常输出当前时间且numpy模块导入成功,同时在命令提示符中执行python --version能正常返回版本信息,则问题已解决。
内容的提问来源于stack exchange,提问作者DiA
相关产品推荐
相关产品推荐

