Python 代码打包为 exe 全攻略(2025–2026 主流方案)
目前 Python 程序打包成 Windows 可执行文件(.exe)的方案已经非常成熟,主要有以下 6 种主流/常用的方式:
| 排名 | 工具名称 | 是否打包解释器 | 文件体积 | 启动速度 | 兼容性 | 维护活跃度 | 推荐场景 | 难度 |
|---|---|---|---|---|---|---|---|---|
| 1 | PyInstaller | 是 | 中~大 | 较慢 | ★★★★★ | 非常活跃 | 几乎所有场景首选 | ★★☆ |
| 2 | Nuitka | 编译为 C → exe | 中~小 | 很快 | ★★★★☆ | 活跃 | 追求速度 & 体积小的项目 | ★★★ |
| 3 | PyOxidizer | Rust 打包 | 中~小 | 很快 | ★★★★ | 活跃 | 追求极致启动速度 & 现代化 | ★★★★ |
| 4 | cx_Freeze | 是 | 中 | 较慢 | ★★★★ | 一般 | 简单脚本、跨平台需求 | ★★☆ |
| 5 | py2exe | 是 | 中~大 | 较慢 | ★★★ | 较少维护 | 极老项目兼容(Python 3 支持一般) | ★★☆ |
| 6 | Shiv / PEX | 不打包,zipapp | 非常小 | 快 | ★★★★ | 活跃 | 命令行工具、分发给有 Python 环境的人 | ★★☆ |
2025–2026 最推荐的排序(按实际使用量与综合体验):
- PyInstaller → 稳定、生态好、文档完善
- Nuitka → 性能更好、体积更小(强烈推荐尝试)
- PyOxidizer → 极致追求启动速度与现代化
- cx_Freeze / Shiv(特定场景)
下面逐一详细说明原理、步骤和常见坑。
1. PyInstaller(使用量最大,推荐入门首选)
原理
把 Python 解释器 + 你的代码 + 所有依赖打包到一个文件夹或单个 exe 文件中。运行时会先解压到临时目录,然后执行。
基本步骤
# 1. 安装
pip install pyinstaller
# 2. 简单打包(单个文件)
pyinstaller -F your_script.py
# 3. 常用参数组合(推荐)
pyinstaller \
-F \ # 单文件
--noconsole \ # 无控制台窗口(GUI程序)
--icon=app.ico \ # 设置图标
--add-data "images;images" \ # 附加文件夹(注意分号)
--hidden-import=pkg_resources \ # 解决部分库隐藏导入问题
--clean \ # 清理临时文件
your_script.py
常见坑与解决方案
- 缺少模块(ModuleNotFoundError)
→ 加--hidden-import=模块名或修改.spec文件 - 图片、配置文件找不到
→ 使用sys._MEIPASS获取临时解压路径
import sys
import os
def resource_path(relative_path):
"""获取资源绝对路径(打包前后兼容)"""
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
- 文件体积过大
→ 使用 UPX 压缩(--upx-dir)或排除不必要的依赖 - 杀毒软件误报
→ 正常现象,建议用--onedir模式或提交白名单
2. Nuitka(性能更好、体积更小)
原理
把 Python 代码翻译成 C 代码,再编译成机器码。
不依赖 Python 解释器,启动速度快,体积相对较小。
基本步骤
# 安装(推荐使用最新版)
pip install -U nuitka
# 推荐打包命令
python -m nuitka \
--standalone \
--onefile \ # 单文件(推荐)
--windows-disable-console \ # 无控制台
--include-data-dir=images=images \
--plugin-enable=pylint-warnings \
--windows-icon-from-ico=app.ico \
your_script.py
优点对比 PyInstaller
- 启动速度明显更快(接近原生 C 程序)
- 最终文件体积通常更小
- 不需要解压到临时目录
缺点
- 编译时间较长(首次几分钟)
- 对一些动态特性(eval、exec、某些 metaclass)支持不完美
3. PyOxidizer(现代化、启动最快)
原理
使用 Rust 编写,把 Python 解释器 + 代码嵌入到一个原生可执行文件中,几乎无解压开销。
基本步骤(2025 年推荐方式)
- 安装 PyOxidizer
pip install pyoxidizer
- 创建项目
pyoxidizer init-executable myapp
cd myapp
- 编辑
pyoxidizer.bzl(配置文件) - 构建
pyoxidizer build
特点
- 启动速度极快(几乎无冷启动延迟)
- 支持嵌入资源、自定义 Python 解释器
- 适合追求极致体验的桌面应用
缺点
- 配置相对复杂
- 社区规模小于 PyInstaller
4. 快速对比总结表(2025–2026 实际体验)
| 需求 | 首选工具 | 次选工具 | 备注 |
|---|---|---|---|
| 快速上手、生态好 | PyInstaller | cx_Freeze | 文档最多、问题最容易搜到 |
| 追求启动速度 & 体积 | Nuitka | PyOxidizer | Nuitka 更成熟,PyOxidizer 更现代 |
| 命令行工具、分发给运维 | Shiv / PEX | PyInstaller | 不打包解释器,体积最小 |
| GUI 程序,无控制台 | PyInstaller -F –noconsole | Nuitka –onefile –windows-disable-console | — |
| 极致性能 | Nuitka / PyOxidizer | — | — |
5. 通用避坑指南(强烈建议收藏)
- 路径问题(最常见坑)
- 永远不要用相对路径
- 使用
resource_path()函数(见 PyInstaller 示例)
- 第三方库兼容性
- PyQt5/PySide6 → 必须加
--hidden-import - pandas/numpy → 通常自动识别,但有时需加
--include-data-dir - tkinter → PyInstaller 一般没问题,Nuitka 需要额外配置
- 图标不生效
- 必须是
.ico格式(Windows) - 建议 256×256 多尺寸 ico 文件
- 杀毒报毒
- 单文件模式最容易被报
- 建议用
--onedir模式分发,或提交给杀毒厂商加白
- 版本管理
- 建议用虚拟环境打包
- 记录
requirements.txt和 Python 版本
- 测试建议
- 在干净的 Windows 虚拟机上测试(无 Python 环境)
- 测试不同杀毒软件的表现
总结:2025–2026 年打包推荐策略
- 普通脚本 / 小工具 → PyInstaller 单文件
- 对启动速度有要求 → Nuitka(强烈推荐)
- 追求极致现代化 → PyOxidizer
- 命令行工具给别人用 → Shiv / PEX
- 老项目兼容 → cx_Freeze 或 py2exe
希望这篇攻略能帮你快速做出决策并成功打包。
如果你有具体的项目类型(GUI、命令行、涉及 pandas、PyQt、机器学习模型等),可以告诉我,我可以给出更精确的命令和配置方案。