问题
Fatal Python error : Py_Initialize : unable to load the file system codec
ModuleNotFoundError: No module named ‘encodings’
如果你出现上述错误,且具备以下条件,请往下看:
- 使用的是虚拟Python环境,且VS里配置的lib、include 两个文件夹是从虚拟环境中复制过来的,DLLs、libs两个文件夹和 Python.XXdll文件是从虚拟环境依赖的Python目录复制过来的
- 在本机编译运行一切正常,在其他主机上报错
提示:如果exe在其他电脑上出现缺少 xxx.dll 的错误,可将 运行库
改为 MDd模式
来解决问题
原因
那么遇到上述问题,原因大概率是:
每个虚拟的Python环境都是根据一个现有的完整Python编译器生成的,虚拟环境的目录下只是包含一些基本的配置文件和虚拟环境独有的开发包,环境中所使用的编译器还是完整目录下的Python编译器,
问题的关键在于,虚拟环境会记录 Python编译器的绝对路径;因此在其他主机上运行Python虚拟环境时,虚拟环境仍然会去这个绝对路径下寻找Python编译器,结果自然是找不到。
其实,对于Python虚拟环境来说,随意改变所依赖编译器的路径,或者虚拟环境本身的路径,都会造成虚拟环境失效,原因和上述问题出现的原因相同
解决方案
- 不使用虚拟环境,VS中用到的所有文件夹都来自于完整的Python环境目录下
- 如果使用方法1,会打包大量无用的Python包,从而造成C++打包所依赖的文件过大,这时候先执行方式1,让VS中所有的文件夹来源于完整的Python环境目录,然后将 lib文件夹下的 site-packages 文件夹替换成 虚拟环境中 lib 文件夹下的 site-packages 文件,这样就能避免打包无用Python开发包了
c++如何调用python脚本请参考这篇文章->C++通过内嵌解释器调用Python及间接调用Python三方库