使用PyInstaller打包Python程序为独立可执行exe文件

一、背景

在开发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文件就可以正常运行起来了。

希望以上内容对你有帮助,喜欢的同学麻烦点个赞+收藏+关注,一键三连!欢迎关注下方我的公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享各类测试开发知识干货,你的支持就是作者更新最大的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值