Pyinstaller打包记录--打包指南
Pyinstaller打包指南
pyinstaller可将python程序打包成可执行文件,无需配置python环境,提升用户体验、便于分发。
目录
快速开始
准备工作
安装 PyInstaller
打开终端(CMD 或 PowerShell),输入:
1 | pip install pyinstaller |
一键打包命令
场景1:简单脚本(无外部资源):
适合只有一个 .py 文件,不依赖外部配置、图片、模型文件的程序。
1 | pyinstaller -F -w your_script.py # your_script.py 为需打包的脚本文件 |
参数说明:
| 参数 | 全称 | 说明 | 适用场景 |
|---|---|---|---|
-F |
--onefile |
打包成单个 exe 文件 | 简单脚本,文件体积小 |
-w |
--windowed |
无控制台窗口 | GUI 程序(PyQt5、Tkinter) |
输出结果:
1 | dist/ |
场景2:包含资源文件的项目
适合包含模型、配置文件、图片等资源的复杂项目。
1 | pyinstaller 主入口脚本.py \ |
参数详解:
| 参数 | 说明 | 示例 |
|---|---|---|
--name |
自定义输出名称 | --name="检测程序" |
--onedir |
文件夹模式(推荐) | 生成 MyApp/ 文件夹 |
--add-data |
添加资源文件 | "源路径;目标路径" |
--hidden-import |
强制导入模块 | 动态导入的库 |
--noconsole |
隐藏控制台(同 -w) |
GUI 程序使用 |
--clean |
清理缓存 | 避免旧文件干扰 |
-y |
自动确认覆盖 | 跳过提示 |
--runtime-tmpdir |
指定临时文件解压位置 | 自定义运行时目录 |
--exclude-module |
排除不需要的模块 | 减小体积 |
Windows 路径分隔符说明:
1 | # Windows 使用分号 ; |
完整示例(PyQt5 检测程序):
1 | pyinstaller detection_app.py \ |
输出结果:
1 | dist/ |
注意:至此,基本打包已完成!以下为复杂任务的打包进阶配置流程。
进阶配置
对于包含模型文件、图片、配置文件或多个代码文件的复杂项目,推荐使用
.spec配置文件进行打包。
打包模式的选择
PyInstaller 有两种主要模式:
- 单文件模式 (-F)
- 文件夹模式 (-D) (默认)
模式对比:
| 特性 | 文件夹模式 (-D) | 单文件模式 (-F) |
|---|---|---|
| 输出 | 文件夹 + exe | 单个 exe |
| 打包速度 | 快(3-5分钟) | 慢(10-30分钟) |
| 启动速度 | 快(直接运行) | 慢(需先解压) |
| 体积 | 适中(150-500MB) | 大(300MB-2GB) |
| 调试难度 | 容易 | 困难 |
| 兼容性 | 好 | 一般 |
| 分发 | 需打包成 ZIP | 单文件直接分发 |
| 数据文件 | 可单独更新 | 无法单独更新 |
| 推荐度 | 推荐 | 不推荐 |
步骤 1: 生成.spec配置文件
在项目根目录下运行:
1 | pyinstaller your_script.py --name="MyProject" |
运行后,会发现当前目录下多了一个 MyProject.spec 文件。
可选参数:
1 | pyinstaller your_script.py \ |
| 参数 | 说明 |
|---|---|
--distpath |
指定输出目录(默认 ./dist) |
--workpath |
指定构建缓存目录(默认 ./build) |
--specpath |
指定 spec 文件保存位置(默认当前目录) |
-y |
自动覆盖已存在的文件 |
步骤 2: 编辑 .spec 文件
打开MyProject.spec,按需修改:
文件夹模式示例:
1 | # -*- mode: python ; coding: utf-8 -*- |
单文件模式配置:
如果坚持使用单文件模式,只需要修改EXE部分
1 | exe = EXE( |
步骤 3: 使用.spec文件打包
编辑保存.spec后,运行:
1 | pyinstaller MyProject.spec --clean -y |
打包输出结构:
文件夹模式输出:
1 | your_project/ |
单文件模式输出:
1 | your_project/ |
常见问题
问题 1: “ModuleNotFoundError: No module named ‘xxx’”
原因: 某个模块没有被 PyInstaller 自动检测到
解决方案:
在 .spec 文件的 hiddenimports 中添加缺失的模块名:
1 | hiddenimports=[ |
问题 2: 数据文件未被包含(如 weights、utils)
原因: datas 配置不正确或路径错误。
解决方案:
方法 1:检查 .spec 配置
1 | datas=[ |
方法 2:使用绝对路径
1 | import os |
方法 3:检查打包后的文件
在 dist/MyApp/_internal/ 目录下,确认数据文件是否存在。
问题 3: exe 文件很大(>1GB)
原因: 包含了过多的依赖库(如 torch、opencv)
解决方案:
1 | # 方法1. 排除不必要的模块 |
问题4:打包时提示错误struct.error: argument out of range
原因:打包的文件总大小超过了 PyInstaller 的限制(单文件模式)。
解决方案:
方法 1:使用文件夹模式
1 | # 将 -F 改为 -D |
方法 2:精确指定需要的文件
1 | # 使用绝对路径指定每个必需的文件 |
方法 3:分离大文件
将大型模型文件放在程序外,运行时从外部加载:
1 | # 不打包进 exe,运行时从外部加载 |
问题 5: 程序运行时找不到数据文件
原因: 代码中使用相对路径,打包后路径发生变化。
解决方案:
在代码中添加路径处理函数:
1 | import sys |
适用于各种文件类型:
1 | # 模型文件 |
问题 6: 打包后 PyQt5 窗口无法显示
原因: PyQt5 plugin 未被正确包含
解决方案:
1 | # 在 spec 文件中确保添加了 PyQt5 相关的隐藏导入 |
问题7:windows打包后报错0007错误
原因:缺少 Visual C++ 运行库或系统驱动问题
图例:

解决方案:
方法 1:安装 Visual C++ 运行库
下载并安装:
方法 2:更新系统驱动
- 更新显卡驱动
- 更新 Windows 系统
版本历史
- 2025-06-08: 初始版本