文章目录
一、背景
在开发Python应用程序的过程中,我们可能会遇到需要将Python项目或脚本打包成一个独立的可执行文件的情况,以便于在其他电脑上快速运行,或者在其他没有安装Python环境的机器上运行。
此外,有时候我们写了一个小工具,也可能会需要打包为exe文件方便其他人通过exe文件直接双击运行工具。这时候,PyInstaller 就是一个非常实用的工具了,pyinstaller是一个第三方模块,专用于python程序的exe打包。
pyinstaller的官网是:https://pyinstaller.org/
二、安装
首先,你需要确保你的环境中已经安装了 PyInstaller。如果还没有安装,可以通过 pip 命令轻松安装:
pip install pyinstaller
三、开始打包
3.1 常用打包命令总结如下:
- pyinstaller xxx.py 打包成一个文件夹
- pyinstaller -F xxx.py 打包一个exe文件,双击exe文件运行,默认会弹出Windows控制台窗口运行(仅对 Windows 有效)
- pyinstaller -F -w xxx.py 打包一个不带控制台的exe
- pyinstaller -F -c xxx.py 指定为打包成一个带Windows控制台窗口的exe
- pyinstaller -F -i xxx.ico xxx.py 打包一个指定图标的exe
3.2 执行打包命令
假设项目的主运行文件叫:lark_manager.py,PyCharm终端执行打包命令:
pyinstaller -F lark_manager.py
看到下面的Building EXE successfully则说明打包成功:
注意:如果运行pyinstaller相关命令报错"The ‘pathlib’ package is an obsolete backport of a standard library package and is incompatible with PyInstaller.",则直接删除掉pathlib库,使用:
pip uninstall pathlib
然后再重新使用pyinstaller命令即可。
四、打包产生的文件
打包完成后,打包目录下你会发现生成了一些文件,下面我们对每个文件做一些说明:
4.1 spec文件
pyinstaller会生成一个spec文件将一些打包参数放到里面:
以后有代码更新,想重新打包的时候,如果你对 .spec 文件进行了自定义配置,可以直接使用下面的命令打包:
pyinstaller lark_manager.spec
如果你没有进行任何自定义配置,可以继续之前的打包命令,但要注意这可能会覆盖之前的 .spec 文件:
pyinstaller -F lark_manager.spec
通常来说,稍微复杂一点的项目都会涉及到.spec文件进行自定义配置,.spec文件里面各个条项的含义解释,我们放最后面去说。
4.2 dist文件夹
目录下新生成了一个dist文件夹,里面存储了打包后的EXE文件:
打包完成后的这个exe文件,就是一个独立可运行的文件,不用依赖python环境,可以直接复制这个exe文件到他人的电脑上直接双击运行。
4.3 build文件夹
pyinstaller还会生成一个build文件夹,并写入一些打包的日志信息文件:
五、打包为一个文件夹
如果是想打包为一个文件夹,则使用:pyinstaller xxx.py 打包后的文件夹中包含一个exe文件,以及其他一些依赖文件,比如dll文件:
六、定制EXE文件图标
默认情况下,打包出来的exe文件使用的是下面这种默认的图标:
如果想生成指定图标的exe文件,先准备好一张.ico的图标文件,将图标文件放至工程根目录下,然后使用命令:
pyinstaller -F -i xxx.ico xxx.py
打包一个指定图标的exe,打包后的icon就换成了指定的ico图标:
注意:如果打包后你发现图标没有变,还是用的默认图标,不要慌。实际上图标已经成功更新了,你可以把新生成的exe文件移动/拷贝到其他路径查看确认,或者发送给别人也可以,就会发现图标是更新后的图标了,原因是Windows的图标缓存导致。
七、定制EXE文件启动loading进度条
如果exe文件内容比较庞大,启动比较慢,需要一个启动页面的话,准备一张.png图片文件(必须是.png格式),将图片文件放至工程根目录下,打包时加上:–splash参数
pyinstaller -F --splash xxxx.png xxxx.py
双击exe文件运行后,会发现多了一个弹窗图片显示:
八、spec文件自定义打包配置
正常情况下,如果你的项目不只是一个py文件,而是一个大的项目工程,包含很多其他的py文件、配置文件,以及有很多三方的依赖。
那么想要把这样的一个工程打包为EXE文件,则需要对.spec文件进行相关的自定义配置,这样打包出来的EXE文件才能正常运行。
以下面的这样的一个spec文件举例,我们来对其中重要的字段做一下简单的说明:
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['lark_manager.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=['sqlite3'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
a.datas += [('Utils/test_case.py', './Utils/test_case.py', 'DATA')]
a.datas += [('Utils/util_config.py', './Utils/util_config.py', 'DATA')]
a.version = ' v1.0'
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='lark_manager' + a.version,
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['favicon.ico'],
)
['lark_manager.py']: 这是主要的入口点,即你要打包的应用程序。
datas=[...]: 项目中需要用到的数据配置文件、静态资源文件,需要添加到datas里面。
通常会使用上面的a.datas写法添加:
a.datas += [('Utils/test_case.py', './Utils/test_case.py', 'DATA')]
a.datas += [('Utils/util_config.py', './Utils/util_config.py', 'DATA')]
hiddenimports=['sqlite3', ...]: 列出那些被导入但 PyInstaller 无法自动检测到的模块,这些模块会被强制包含在打包过程中。
a.version = ' v1.0' 设置了一个版本字符串,这个字符串稍后会被添加到可执行文件的名字中。
name='lark_manager' + a.version: 最终可执行文件的名字将会是 lark_manager v1.0。
其他的参数基本可以不变,就使用spec文件生成时的默认值就OK,这里不再赘述。需要经常根据自己的项目动态配置的主要是a.datas和hiddenimports,哪些需要加到a.datas,有一个简单的总结:
1. 数据文件 和 静态资源文件 通常需要添加到 a.datas 中。
2. 主脚本 和 被导入的模块,以及标准库和第三方库的文件不需要添加到 a.datas 中,PyInstaller 会自动处理它们。
最后,你需要根据你打包后的EXE文件运行时的报错信息,根据报错信息添加对应添加缺失的内容到spec文件中,以保障最终的EXE文件运行正常。比如打包出来的EXE文件运行报错:
报错信息提示: No module named ‘mss’, 意思是缺少了mss库,那么则需要在spec中的anlysis函数中的hiddenimports=[],加上’mss’:
hiddenimports=['mss']
添加后重新打包再次运行,EXE文件就可以正常运行起来了。
希望以上内容对你有帮助,喜欢的同学麻烦点个赞+收藏+关注,一键三连!欢迎关注下方我的公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享各类测试开发知识干货,你的支持就是作者更新最大的动力。