使用如下命令进行安装
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 命令查看详细的选项信息。
同时给出官方的 使用说明
首先使用如下命令进行打包:
pyinstaller -F -w main.py
运行打包后的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文件后仍然报错:
排错:
1)根据错误提示信息,意思是无法将WindowsPath与字符串相加,所以一直以为是Python不支持 PyInstaller或PySide6的某个语法,于是把PyInstaller和PySide6删除又安装,没有作用;
2)使用pip替代conda,重新安装PyInstaller和PySide6,或者更换pip为默认源,都没用。
最后进入到发生错误的位置:PySide6\__ init __.py 中查看
找到发生错误的地方,第26行
从这段代码中可以看到,其实是想告诉我,没有找到 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
如果打包的应用是窗体程序,需要在最终的命令中使用-w选项,表示不显示命令行窗口。
但如果不确定当前打包是否缺少文件或模块,可以先不要加-w,这样产生的错误可以输出在命令行窗口中,方便进行调试。
程序打包之后,一般生成的是一个exe文件,如果双击exe,命令行窗口闪退,可以采用另一种方式打开exe文件。
首先打开命令行(cmd)
然后将exe文件拖拽到命令行中
点击回车即可运行该exe文件,这个时候命令行窗口不会退出,就可以在窗口中查看错误信息进行调试。
问题:有时候会有问题,比如项目使用相对路径找 settings.json
文件,但cmd的工作空间在 C:\Users\Administrator
,那么就会去 C:\Users\Administrator\settings.json
找,找不到就会报错
解决方式:调试的时候,在exe所在目录打开cmd,或者切换cmd工作空间为exe所在目录,然后再将exe文件拖进去运行
当调试好确保exe文件运行无误之后,即确定打包命令所需要添加的选项之后,再加-w选项,生成不带命令行窗口的exe程序。
最后记得把一些资源(如json文件、图片、一些项目所需的文件夹、图标、xml等),复制到打包好的exe文件目录下,或复制到之前在代码中编写的相对目录位置下。
http://c.biancheng.net/view/2690.html