Pyinstaller使用以及配置文件编写
PyInstaller 使用以及配置文件编写
目录
- PyInstaller 使用以及配置文件编写
1. 什么是 PyInstaller
1.1 PyInstaller 简介
一句话来说:PyInstaller 是一个将 Python 程序打包成独立可执行文件的工具,让设备上没有 Python 环境的用户也能运行你的程序。
PyInstaller是怎么实现的?
- 分析依赖:找出程序需要哪些库
- 收集文件:把所有需要的 Python 库、数据文件、DLL(动态链接库)都收集起来
- 打包成 EXE:把所有东西打包成一个可执行文件或文件夹
- 添加启动器:创建一个
.exe文件,让 Windows 能直接运行
1.2 PyInstaller 的常用指令
1 | pyinstaller your_script.py ##最简单的打包这是最基础的命令。它会生成一个 dist 文件夹,其中包含一个可执行文件和所有依赖文件(多文件模式)。 |
每次都使用较长的命令行参数会很麻烦,所以我们可以使用配置文件(spec文件)来简化打包过程。
2. PyInstaller 配置文件(spec 文件)
2.1 什么是 spec 文件
一句话来说:spec 文件是 PyInstaller 的配置文件,定义了如何打包你的 Python 程序。
为什么要用 Spec 文件?
- 简化命令行:只需运行
pyinstaller your_script.spec,而不是每次都输入长命令。 - 灵活配置:可以详细指定打包选项,如添加数据文件、隐藏导入等。
- 可重复使用:保存打包配置,方便以后再次打包。
2.2 Spec 文件结构
一个完整的 Spec 可以分为 4 个主要阶段:
1 | # -*- mode: python ; coding: utf-8 -*- 告诉系统这是个 Python 脚本、支持中文字符 |
2.3 Analysis 分析阶段
分析依赖是最核心、最复杂的部分。主要参数包括:
1 | a = Analysis( |
2.3.1 入口脚本 (scripts)
作用:告诉 PyInstaller 从哪个文件开始分析。
单个入口:
1 | a = Analysis(['main.py']) |
多个入口(不常用):
1 | a = Analysis(['main.py', 'helper.py']) |
2.3.2 数据文件 (datas) 与二进制文件 (binaries)
数据文件作用:打包非 Python 代码的文件(图片、配置、模型等)。
二进制文件作用:打包 DLL、SO、DYLIB 等动态链接库。
格式:(源路径, 目标路径)
示例:
1 | datas=[ |
2.3.3 隐藏导入 (hiddenimports)
作用:手动添加 PyInstaller 分析不出来的模块。
什么时候需要隐藏导入?
- 动态导入(用字符串导入)
- 插件系统
- 可选依赖
- C 扩展模块
示例:
1 | #动态导入的模块 |
2.3.4 钩子路径 (hookspath)
钩子(Hook)可以帮助 PyInstaller 正确处理复杂的库。
钩子文件必须命名为 hook-<包名>.py:
hook-onnxruntime.py- 处理 onnxruntime 包hook-tkinter.py- 处理 tkinter 包
钩子路径作用:指定自定义钩子文件的目录。
2.3.5 排除模块 (excludes)
作用:明确告诉 PyInstaller 不要打包某些模块。
为什么要排除?
- 减小体积 - 排除不用的大型库
- 避免冲突 - 排除可能引起问题的库
- 加快打包 - 少分析一些模块
示例(具体排除什么请根据项目来裁定):
1 | excludes = [ |
2.3.6 collect_all() 自动收集
作用:自动收集某个包的所有内容。
1 | from PyInstaller.utils.hooks import collect_all |
2.4 PYZ 阶段
2.4.1 基本用法
1 | pyz = PYZ( |
2.4.2 参数说明
| 参数 | 说明 | 常用值 |
|---|---|---|
a.pure |
Analysis 收集的纯 Python 模块 | 固定写法 |
a.zipped_data |
需要压缩的数据 | 固定写法 |
cipher |
加密密钥 | None(不加密) |
2.5 EXE 阶段
2.5.1 基础参数
1 | exe = EXE( |
2.5.2 参数详细介绍
console - 是否显示控制台
1 | console=False # GUI 程序,不显示黑窗口 |
icon - 程序图标
1 | icon='assets/icon.ico' |
要求:
- 必须是
.ico格式 - 推荐尺寸:256x256 或 512x512
- 可以包含多个尺寸(Windows 会自动选择)
upx - 压缩 EXE
1 | upx=True # 启用 UPX 压缩(推荐) |
UPX 是什么?
- UPX = Ultimate Packer for eXecutables
- 压缩 EXE 和 DLL 文件
- 运行时自动解压(透明)
exclude_binaries - 是否排除二进制文件
1 | exclude_binaries=True # 二进制文件放 _internal/ (推荐) |
对比:
exclude_binaries=True |
exclude_binaries=False |
|---|---|
| EXE 文件小 | EXE 文件巨大 |
DLL 放 _internal/ 目录 |
全部打包进 EXE |
| 启动稍快 | 启动极慢 |
| 文件夹模式 | 单文件模式 |
2.6 COLLECT 阶段
2.6.1 基本用法
1 | coll = COLLECT( |
2.6.2 参数说明
| 参数 | 说明 |
|---|---|
exe |
EXE 对象(从上一步来) |
a.binaries |
所有 DLL 等二进制文件 |
a.zipfiles |
ZIP 压缩文件 |
a.datas |
所有数据文件 |
name |
输出文件夹的名称 |
upx |
是否压缩 DLL |
upx_exclude |
哪些文件不要压缩 |
2.6.3 upx_exclude - 排除某些文件的压缩
有些 DLL 不能用 UPX 压缩,否则会出错:
1 | coll = COLLECT( |
3. 总结
Pyinstaller 流程图:
1 | 入口文件 (main.py) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 AliveRiver!
