解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题

@[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自带的添加库的选项,选项如下:
解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题_第1张图片
解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题_第2张图片

在初始化之前添加python的路径,注意要准确:

Py_SetPythonHome(L"C:\\ProgramData\\Anaconda3");
Py_Initialize();

这样解决了部分问题,这样在编译时候是可以正常运行的。

发布后的新问题

但打包发布后的程序在用户端,由于没有C:\ProgramData\Anaconda3这个路径,还是会显示上面的错误。因此需要不能使用Py_SetPythonHome来确定python的路径。

解决办法

注释掉代码中的Py_SetPythome。在环境变量Path中添加路径,我添加的路径如下
解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题_第3张图片
这样编译就能运行了。那么打包客户端没有装python解释器怎么办。
下面介绍具体解决办法。
将调用的py文件用pyinstaller打包成exe

pyinstaller -F testfile.py

生成的build文件夹下的base_libary.zip压缩文件,解压后放在qt生成的exe路径下。
解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题_第4张图片
将base_libary.zip解压后放入exe就可以了,加上python38.dll库这些大小增加大概5M大小,对于发布程序的大小还是可以接受的。
解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题_第5张图片
至此,所有问题解决完毕。我是一名会写代码的建筑结构工程师,可以关注我的微信视频号structurevspoem

你可能感兴趣的:(土木程序开发,c++,python)