1.背景
- 在实际工作过程中,python项目文件完成开发后,存在打包成exe使用的需求,而如何正确并且快捷的实现打包尤为重要,目前python打包的方式很多,包括py2exe,pyinstaller,cx_Freeze,nuitka以及Pyarmor,本次只针对pyinstaller进行说明。
- PyInstaller是一个用于将Python应用程序打包成独立可执行文件的库。它可以将Python代码及其所有依赖项(包括第三方库和资源文件)打包到一个单独的可执行文件中,使得应用程序可以在没有Python解释器环境的系统上独立运行。
2.特点
以下是PyInstaller的一些主要特点和功能:
- 跨平台支持:PyInstaller可以在主流操作系统(如Windows、macOS和Linux)上运行,并生成相应平台的可执行文件
- 自动化打包:PyInstaller会分析Python代码及其依赖项,自动检测所需的模块和资源文件,并将它们打包到一个可执行文件中
- 独立可执行文件:打包后的可执行文件包含了应用程序的所有依赖项,不需要用户单独安装Python解释器或相关库
- 支持多种打包选项:PyInstaller提供了多种打包选项,可以定制可执行文件的行为,如设置命令行参数、图标、文件路径等
- 支持多种GUI框架:PyInstaller支持常见的GUI框架,如Tkinter、PyQt、wxPython等,可以将基于这些框架开发的应用程序打包为独立可执行文件
3.打包方式
3.1单文件打包法
单个文件内容,直接使用pyinstaller命令打包,打包后自动生成exe运行文件使用。
# 1.执行命令
pyinstaller -F xxx.py
# 2.去生成的dist文件夹找xxx.exe运行
# 3.运行成功,xxx.exe则为可执行文件,删除其它文件
3.2多文件打包法
当存在多个文件时,需要指定好程序入口文件,使用pyinstall -D后,生成spec文件,修改spec文件,再使用pyinstaller -F打包。
# 1.执行命令,xxx.py为程序入口文件
pyinstall -D xxx.py
# 2.删除生成的bulid和dist文件夹,仅保留xxx.spec文件
# 3.修改xxx.spec文件,详见2.2.1
# 4.执行命令
pyinstaller -F xxx.spec
# 5.去dist文件夹下找xxx.exe文件
# 6.运行成功,删除临时文件目录build;dist目录为打包的结果,可执行文件和其它程序运行的关联文件都在这个目录下
3.3配置文件打包法(最为简单)
此种方法最为直接简单,先生成spec配置文件,然后修改文件后,直接使用pyinstaller命令打包。
#第一步生成配置文件
pyi-makespec XXX.py 获取spec配置
#第二步修改配置文件
#第三步打包命令
pyinstaller XXX.spec
打包过程如图:
打包成功结果如图:
4.SPEC配置文件
以下是spec配置文件,还可以直接按照文件内容提示填入所需文件名、打包名称等,从而更为简单的使用pyinstaller XXX.spec完成打包。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['PY主文件',
'PY1辅助文件',
'PY2辅助文件',
'PY3辅助文件',],
pathex=['多个PY文件所在路径'],
binaries=[],# 程序调用外部pyd、dll文件(二进制文件路径)以数组形式传入
datas=[],# 存放的资源文件
hiddenimports=[],# pyinstaller解析模块时可能会遗漏某些模块
hookspath=[],
hooksconfig={},
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='修改EXE的文件名',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
5.拓展
对提到的五种打包库进行以下简单介绍:
- py2exe:
- 跨平台支持有限,主要用于将Python脚本打包为Windows可执行文件
- 简单易用,配置相对简单,适合简单的打包需求
- 可以将Python解释器和依赖项打包到单个可执行文件中
- PyInstaller:
- 跨平台支持广泛,可以生成Windows、macOS和Linux等系统上的可执行文件
- 自动化打包,能够自动检测和包含所有依赖项
- 支持多种GUI框架,如Tkinter、PyQt、wxPython等
- 可以生成独立的可执行文件,无需安装Python解释器
- cx_Freeze:
- 跨平台支持,可以生成Windows、macOS和Linux等系统上的可执行文件
- 配置灵活,可以根据需求进行定制
- 支持多种GUI框架和第三方库
- 生成的可执行文件较小,具有较小的内存占用
- Nuitka:
- 将Python代码编译为机器码,提高执行效率
- 生成的可执行文件性能较高,执行速度比解释执行的Python代码更快
- 与许多第三方库和C扩展兼容
- 跨平台支持广泛,可以生成Windows、macOS和Linux等系统上的可执行文件
- Pyarmor:
- 用于保护Python代码,提供加密和混淆功能,以防止未经授权的访问和复制
- 支持对Python脚本进行防调试和防反向工程处理
- 配置简单,可以与其他打包工具结合使用
- 跨平台支持,可以在不同系统上使用
这些工具在Python打包和分发方面都有其独特的特点和适用场景,选择合适的工具取决于我们的具体需求,例如目标平台、代码保护需求、对第三方库的支持程度以及打包后的可执行文件的性能要求等。