@[TOC](解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings’)及打包发布问题
问题1描述
在QT C++中调用python网上有不少例子,但是怎么操作还是报错。
Python path configuration:
PYTHONHOME = ‘C:\ProgramData\Anaconda3\Scripts’
PYTHONPATH = (not set)
program name = ‘python’
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = ‘C:\Users\Administrator\Documents\build-testCplusPy-Desktop_Qt_5_15_2_MSVC2019_64bit-Release\release\testCplusPy.exe’
sys.base_prefix = ‘C:\ProgramData\Anaconda3\Scripts’
sys.base_exec_prefix = ‘C:\ProgramData\Anaconda3\Scripts’
sys.executable = ‘C:\Users\Administrator\Documents\build-testCplusPy-Desktop_Qt_5_15_2_MSVC2019_64bit-Release\release\testCplusPy.exe’
sys.prefix = ‘C:\ProgramData\Anaconda3\Scripts’
sys.exec_prefix = ‘C:\ProgramData\Anaconda3\Scripts’
sys.path = [
‘C:\Users\Administrator\Documents\build-testCplusPy-Desktop_Qt_5_15_2_MSVC2019_64bit-Release\release\python38.zip’,
‘C:\ProgramData\Anaconda3\Scripts\DLLs’,
‘C:\ProgramData\Anaconda3\Scripts\lib’,
‘C:\Users\Administrator\Documents\build-testCplusPy-Desktop_Qt_5_15_2_MSVC2019_64bit-Release\release’,
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named ‘encodings’
Fatal Python error: failed to get the Python codec of the filesystem encoding
Current thread 0x00002c20 (most recent call first):
解决办法
在pro文件中添加库:.
LIBS += -L$$PWD/../../../../ProgramData/Anaconda3/libs/ -lpython38
INCLUDEPATH += $$PWD/../../../../ProgramData/Anaconda3/include
DEPENDPATH += $$PWD/../../../../ProgramData/Anaconda3/include
具体操作是,利用QT_Creator自带的添加库的选项,选项如下:
在初始化之前添加python的路径,注意要准确:
Py_SetPythonHome(L"C:\\ProgramData\\Anaconda3");
Py_Initialize();
这样解决了部分问题,这样在编译时候是可以正常运行的。
发布后的新问题
但打包发布后的程序在用户端,由于没有C:\ProgramData\Anaconda3这个路径,还是会显示上面的错误。因此需要不能使用Py_SetPythonHome来确定python的路径。
解决办法
注释掉代码中的Py_SetPythome。在环境变量Path中添加路径,我添加的路径如下
这样编译就能运行了。那么打包客户端没有装python解释器怎么办。
下面介绍具体解决办法。
将调用的py文件用pyinstaller打包成exe
pyinstaller -F testfile.py
生成的build文件夹下的base_libary.zip压缩文件,解压后放在qt生成的exe路径下。
将base_libary.zip解压后放入exe就可以了,加上python38.dll库这些大小增加大概5M大小,对于发布程序的大小还是可以接受的。
至此,所有问题解决完毕。我是一名会写代码的建筑结构工程师,可以关注我的微信视频号structurevspoem