PyQT将程序打包生成exe文件
# 环境
操作系统:win10
Python3
所需要的库:主要是PyQT5,因为加了一点拓展功能,所以还有sqlite3,Image,pyinstaller
pip3 install pyqt5
pip3 install pyqt5-tools
pip3 install sqilte3
pip3 install Image
pip3 install pyinstaller
2
3
4
5
6
首先是pyqt5, 这个是我们的主要工具,用来做界面的,pyqt5-tools这个库主要是是在用QT Creator设计好界面之后,将ui文件转化为py文件;
sqlite3这个库可以安也可以不安,因为pyqt5里面有一个模块QtSql,它支持sqlite的操作; Image这个库主要是用来处理一下图片资源,以及最后程序的图标的 pyinstaller 最后将程序转化为可执行的exe文件
# pyinstaller
这里使用的打包工具是pyintaller,当然还有别的工具,这里就不再关注了。
pyinstaller安装好之后,通过pyinstall -h 可以看到一些帮助命令
$ pyinstaller -h
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
[--add-data <SRC;DEST or SRC:DEST>]
[--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
[--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
[--key KEY] [-d [{all,imports,bootloader,noarchive}]] [-s]
[--noupx] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
[--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--runtime-tmpdir PATH] [--bootloader-ignore-signals]
[--distpath DIR] [--workpath WORKPATH] [-y]
[--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
scriptname [scriptname ...]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
具体的命令是什么作用可以在网上查一查
这里说一下要用到的几个命令:
-i icon.ico 为程序设置图标 (注意图标大小格式有要求,一般128*128基本能满足要求) -F:表示是单文件exe -w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效) -c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效) -p 文件名 依赖的文件名字,即导入的本地文件或者资源文件 --hidden-import 导入的文件名
我的理解是-p 与--hidden-import一般一起使用,比如要导入images.py这个本地资源包,得如下使用:
pyinstaller -i logo.ico -w -F PasswordManagerSyster.py -p images.py --hidden-import images
当然也可以直接使用另外一个命令pyi-makespec 程序文件 ,生成spec文件(执行完上面一条命令也会生成一个spec文件)
spec文件如下:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['PasswordManageSystem.py'],
pathex=['images.py', 'C:\\code\\Python\\PyQT5test\\PasswordManagerSystem'],
binaries=[],
datas=[],
hiddenimports=['images'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='PWManager',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False , icon='logo.ico')
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
其实通过对比,就可以发现,在shell或者说cmd命令行下输入得命令,最后都能在这个spec文件中找到对应得地方,所以也可以直接修改spec文件。
Analysis中得第一个参数就是我们得main文件
pathex里面的内容,就是-p后面跟的文件
hiddenimports 要导入的本地包
console=False #这个就是 -w或者-c
icon='logo.ico' 就是最后生成的程序图标
修改好这个spec文件,最后执行
pyinstaller PasswordManageSystem.spec
# 实践
除了命令行,也可以直接使用pycharm的External Tools 安装 pyinstaller工具
使用打包命令
pyinstaller -F -w C:\Users\JulianYang\Desktop\testJ\milestone\camera1.py
选择配置参数
program: E:\PycharmProjects\untitled\venv\Scripts\pyinstaller.exe
Arguments: -F -w $FileNameWithoutExtension$.py
working directory:$FileDir$
打开dist目录下生成的main.exe 错误提示:failed to cecute script main
PyQt5 Pyinstaller Failed to execute script部分解决方法
- 取消 -w 参数,让他显示命令窗口;
- 按住shift,右击鼠标,选择 “在此处打开powershell”(或命令窗口);
- 将生成的exe拖入,按回车;
- 可以看到具体的报错信息;
- 如果是“unable to find Qt5xx.dll”,就将Python安装路径下的**/Lib/site-packages/PyQt5/Qt/bin**添加到环境变量;
- 如果是“no module xxx”,就pip install安装对应的模块;
PS E:\PycharmProjects\Calculation_Tree_Tool\treeTool\dist> E:\PycharmProjects\Calculation_Tree_Tool\treeTool\dist\main.exe
Traceback (most recent call last):
File "main.py", line 19, in <module>
ModuleNotFoundError: No module named 'treeTool'
[3516] Failed to execute script main
PS E:\PycharmProjects\Calculation_Tree_Tool\treeTool\dist>
2
3
4
5
6
查看导入的包路径:from treeTool.mwin import Ui_MWin
发现是导入路径中多了一层包路径,导致运行时从对应的路径无法导入模块。
项目路径:E:\PycharmProjects\Calculation_Tree_Tool\treeTool
去除子目录treeTool,将所有源文件移到根目录,重新打包exe,运行成功!
# 小结
至此,这个小小的项目就算完结了。
至于说给这个软件添加版本信息,帮助信息,或者要给它增加其他功能什么的,这个等学的比较深入的时候再说吧,
毕竟这只是一个练习项目而已,这么简单的功能