PyInstaller的使用教程及使用PyInstaller打包PySide6程序

1.安装和使用

使用如下命令进行安装

pip install pyinstaller

基本命令:

# 语法:pyinstaller 选项 源文件
pyinstaller -F main.py

常用选项:

选项 作用
-F,-onefile 产生单个的可执行文件
-D,--onedir 产生一个目录(包含多个文件)作为可执行程序
-a,--ascii 不包含 Unicode 字符集支持
-d,--debug 产生 debug 版本的可执行文件
-w,--windowed,--noconsole 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,--nowindowed,--console 指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,--out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,--path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,--name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字
-i 添加图标
--hidden-import 导入未打包进来的模块
--paths 指定导入文件的路径

可以通过 pyinstaller -h 命令查看详细的选项信息。
同时给出官方的 使用说明

2.使用PyInstaller打包PySide程序

首先使用如下命令进行打包:

pyinstaller -F -w main.py

PyInstaller的使用教程及使用PyInstaller打包PySide6程序_第1张图片
运行打包后的exe文件后报如上错误,原因是没有导入 PySide6.QtSvg 模块,对于这种错误,直接在打包的时候,使用-\-hidden-import 命令将缺失的模块导入。

命令如下:

pyinstaller -F -w main.py --hidden-import PySide6.QtSvg

同时注意到,打包过程中,存在如下的警告:

4777 WARNING: lib not found: shiboken6.abi3.dll dependency of D:\ProgramData\Anaconda3\envs\pyside6\lib\site-packages\PySide6\QtSvgWidgets.pyd
4793 WARNING: lib not found: shiboken6.abi3.dll dependency of D:\ProgramData\Anaconda3\envs\pyside6\lib\site-packages\PySide6\QtNetwork.pyd
4815 WARNING: lib not found: shiboken6.abi3.dll dependency of D:\ProgramData\Anaconda3\envs\pyside6\lib\site-packages\PySide6\QtWidgets.pyd
4831 WARNING: lib not found: shiboken6.abi3.dll dependency of D:\ProgramData\Anaconda3\envs\pyside6\lib\site-packages\PySide6\QtGui.pyd
4845 WARNING: lib not found: shiboken6.abi3.dll dependency of D:\ProgramData\Anaconda3\envs\pyside6\lib\site-packages\PySide6\QtCore.pyd
5028 WARNING: lib not found: shiboken6.abi3.dll dependency of D:\ProgramData\Anaconda3\envs\pyside6\lib\site-packages\PySide6\pyside6.abi3.dll

警告的原因是没有找到动态链接库:shiboken6.abi3.dll
这个文件一般在本地的PySide6库中可以找到,在本地搜索 shiboken6.abi3.dll ,找到该文件的路径;
如果没有的话,在此链接可以下载该文件:下载链接

在网上看到的解决方案,是将 shiboken6.abi3.dll 文件所在目录的路径添加到--path中,即:

pyinstaller -F -w main.py --hidden-import PySide6.QtSvg --paths=D:\ProgramData\Anaconda3\envs\pyside6\Lib\site-packages\shiboken6

运行exe文件后仍然报错:
PyInstaller的使用教程及使用PyInstaller打包PySide6程序_第2张图片
排错:
1)根据错误提示信息,意思是无法将WindowsPath与字符串相加,所以一直以为是Python不支持 PyInstaller或PySide6的某个语法,于是把PyInstaller和PySide6删除又安装,没有作用;
2)使用pip替代conda,重新安装PyInstaller和PySide6,或者更换pip为默认源,都没用。

最后进入到发生错误的位置:PySide6\__ init __.py 中查看
PyInstaller的使用教程及使用PyInstaller打包PySide6程序_第3张图片
找到发生错误的地方,第26行
PyInstaller的使用教程及使用PyInstaller打包PySide6程序_第4张图片
从这段代码中可以看到,其实是想告诉我,没有找到 shiboken6,但是在提示信息的组成中,可能存在一些语法的错误,误导了我们,根本原因是 没找到shiboken6

于是在路径中加上 shiboken6.abi3.dll ,即:

pyinstaller -F main.py --hidden-import PySide6.QtSvg --paths D:\ProgramData\Anaconda3\envs\pyside6\Lib\site-packages\shiboken6\shiboken6.abi3.dll

打包成功,运行exe没有问题。

或者,可以直接将 shiboken6.abi3.dll 复制到项目路径中,即:

pyinstaller -F main.py --hidden-import PySide6.QtSvg --paths shiboken6.abi3.dll

3.小tip

如果打包的应用是窗体程序,需要在最终的命令中使用-w选项,表示不显示命令行窗口。
但如果不确定当前打包是否缺少文件或模块,可以先不要加-w,这样产生的错误可以输出在命令行窗口中,方便进行调试。

程序打包之后,一般生成的是一个exe文件,如果双击exe,命令行窗口闪退,可以采用另一种方式打开exe文件。

首先打开命令行(cmd)
然后将exe文件拖拽到命令行中
PyInstaller的使用教程及使用PyInstaller打包PySide6程序_第5张图片
点击回车即可运行该exe文件,这个时候命令行窗口不会退出,就可以在窗口中查看错误信息进行调试。

问题:有时候会有问题,比如项目使用相对路径找 settings.json 文件,但cmd的工作空间在 C:\Users\Administrator ,那么就会去 C:\Users\Administrator\settings.json 找,找不到就会报错

解决方式:调试的时候,在exe所在目录打开cmd,或者切换cmd工作空间为exe所在目录,然后再将exe文件拖进去运行
PyInstaller的使用教程及使用PyInstaller打包PySide6程序_第6张图片
当调试好确保exe文件运行无误之后,即确定打包命令所需要添加的选项之后,再加-w选项,生成不带命令行窗口的exe程序。

最后记得把一些资源(如json文件、图片、一些项目所需的文件夹、图标、xml等),复制到打包好的exe文件目录下,或复制到之前在代码中编写的相对目录位置下。

4.参考

http://c.biancheng.net/view/2690.html

你可能感兴趣的:(Python,python,pyinstaller,pyqt,pip,anaconda)