Python系列之pyinstaller

PyInstaller

PyInstaller 是一个将 Python 程序打包成独立可执行文件的工具,支持 Windows、Linux 和 macOS 等平台。它可以将Python 解释器和所有依赖的库打包到一个单独的可执行文件中,使得用户无需安装 Python 环境即可运行程序。

在 Python 中打包成 EXE 且要求无弹窗、体积小,推荐使用 PyInstaller + UPX 压缩。

1. 安装必要工具

# 安装 PyInstaller
pip install pyinstaller

下载 UPX 并解压到任意目录

2. 打包命令

pyinstaller --onefile --noconsole --name app --icon=logo.ico --add-data="xxx;." --upx-dir="D:\upx-5.0.0-win64" --clean --exclude-module=tests app.py

参数说明

  • --onefile:生成单个可执行文件
  • --noconsole:禁用控制台窗口(GUI程序必选)
  • --name:指定生成的可执行文件名称
  • --icon:指定图标文件路径
  • --add-data:添加额外数据文件(如图标等)
  • --upx-dir:指定 UPX 路径进行二进制压缩(体积减少 30-50%)
  • --clean:清理临时文件
  • --exclude-module:排除不需要的模块

注意事项:

  1. 若图标仅作为EXE文件的显示图标使用,无需--add-data参数。
  2. --add-data参数在Windows和Linux下的分隔符不同:
    • Windows:使用分号 ; 作为路径分隔符
    • Linux:使用冒号 : 作为路径分隔符
  3. 可使用更小的 Python 基础环境(推荐 Python 3.11+,自带更小的嵌入包)

3. 打包示例

3.1. 打包带图标的 EXE 文件

pyinstaller --onefile --noconsole --name app --icon=logo.ico --upx-dir="D:\upx-5.0.0-win64" --clean app.py

3.2. 打包带数据文件的 EXE 文件

pyinstaller --onefile --noconsole --name app --icon=logo.ico --add-data="logo.ico;." --upx-dir="D:\upx-5.0.0-win64" --clean app.py

然后在代码中使用以下方式获取资源文件路径:

# 获取当前可执行文件的目录
import sys
import os

# 当用 PyInstaller 打包时,如果程序被“冻结”(也就是被打包成一个文件),sys.frozen 的值为 True,否则为 False。
if getattr(sys, 'frozen', False):
    # 当前目录为当前可执行文件所在目录
    application_path = sys._MEIPASS
else:
    # 当前目录为当前脚本所在目录
    application_path = os.path.dirname(__file__)
# 获取资源文件的路径
icon_path = os.path.join(application_path, 'example.ico')

4. 替代方案Nuitka

Nuitka 是一个 Python 到 C++ 的编译器,可以将 Python 代码编译成独立的可执行文件。它的优点是可以生成更高效的代码,打包后的程序运行速度更快。但是 Nuitka 的使用相对复杂,需要安装 C++ 编译器,并且编译速度较慢。