Python 代码打包为 EXE 完整指南
目前最主流、最稳定的几种打包方式对比:
| 排名 | 工具 | 优点 | 缺点/坑点 | 适合场景 |
|---|---|---|---|---|
| 1 | PyInstaller | 兼容性最好、社区最大、文档最全 | 生成的 exe 偏大、启动稍慢 | 几乎所有场景(首选) |
本文介绍了将 Python 代码打包为 EXE 文件的完整指南。主要对比了 PyInstaller、Nuitka、cx_Freeze 等主流工具,重点讲解了 PyInstaller 的安装、基本打包命令、常见问题解决及 .spec 文件配置方法,并补充了 Nuitka 在提升启动速度方面的用法。文章提供了从环境准备到最终生成的实操步骤,适用于 Windows 桌面程序开发及分发场景。
目前最主流、最稳定的几种打包方式对比:
| 排名 | 工具 | 优点 | 缺点/坑点 | 适合场景 |
|---|---|---|---|---|
| 1 | PyInstaller | 兼容性最好、社区最大、文档最全 | 生成的 exe 偏大、启动稍慢 | 几乎所有场景(首选) |
| 2 |
| Nuitka |
| 启动速度最快、文件体积较小、接近原生性能 |
| 编译时间长、对依赖处理更严格 |
| 对启动速度敏感的项目 |
| 3 | cx_Freeze | 跨平台支持好、配置灵活 | 社区活跃度低、文档较老 | 需要高度自定义打包逻辑 |
| 4 | PyOxidizer | 极致体积优化、Rust 底层 | 配置复杂、生态不成熟 | 极致追求小体积的场景 |
| 5 | Shiv / PEX | 生成 .pex 文件(类似 jar),不生成 exe | 需要 Python 环境才能运行 | 服务器/内部工具分发(非桌面程序) |
绝大多数人(尤其是 Windows 桌面程序)首选:PyInstaller。
下面给出最实操的完整流程(以 PyInstaller 为主,附 Nuitka 补充)。
# 建议使用干净的虚拟环境
python -m venv pack-env
# Windows
pack-env\Scripts\activate
# macOS/Linux
source pack-env/bin/activate
# 安装最新版
pip install --upgrade pyinstaller
import sys
import tkinter as tk
from tkinter import messagebox
def main():
root = tk.Tk()
root.title("我的第一个打包程序")
root.geometry("400x300")
label = tk.Label(root, text="Hello from EXE!", font=("微软雅黑", 16))
label.pack(pady=50)
btn = tk.Button(root, text="点我", command=lambda: messagebox.showinfo("提示", "打包成功!"))
btn.pack()
root.mainloop()
if __name__ == "__main__":
main()
# 单文件模式(推荐给新手)
pyinstaller -F main.py
# 常用参数组合(强烈推荐)
pyinstaller -F \
--noconfirm \
--clean \
--windowed \
# 无控制台窗口(GUI 程序必加)
--icon=app.ico \
# 可选:自定义图标
--name=MyNoteApp \
# exe 文件名
--add-data "data;data" \
# 如果有资源文件夹(注意分号是 Windows 用,Linux/macOS 用冒号)
main.py
打包完成后,文件出现在:
dist/
└── MyNoteApp.exe ← 这就是最终的 exe
| 问题 | 原因 | 解决方案(最有效写法) |
|---|---|---|
| exe 启动闪退 | 缺少依赖 / 路径错误 | 加 --log-level=DEBUG 看日志;或用 --onedir 先测试 |
| 第三方库(如 pandas、pytorch)打包失败 | hook 不全 | pip install pyinstaller-hooks-contrib;必要时手动写 .spec 文件 |
| 中文路径/文件名乱码 | 编码问题 | 脚本保存为 UTF-8;打包时加 --utf8(较新版本支持) |
| exe 体积过大(100MB+) | 打包了整个 site-packages | 用 --exclude-module 排除无用模块;用 UPX 压缩(--upx-dir) |
| 杀毒软件报毒 | 特征码误杀 | 正常现象,用 --noupx 关闭压缩;或提交文件给杀毒厂商白名单 |
| tkinter / PyQt 等 GUI 黑屏/不显示 | 缺少资源 | 加 --add-data "tcl;tcl" 和 --add-data "tk;tk"(tkinter 常见) |
# myapp.spec
# 运行一次 pyinstaller main.py 后会自动生成 .spec 文件,修改后用下面命令重新打包:
# pyinstaller myapp.spec
block_cipher = None
a = Analysis(['main.py'], pathex=[], binaries=[], datas=[('images/*','images'),('config.yaml','.')], hiddenimports=['PIL._tkinter_finder'],# tkinter + pillow 常见补丁
hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=['torch','tensorflow'],# 排除掉不需要的重量级库
win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher,)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz, a.scripts, a.binaries, a.zipfiles, a.datas,[], name='我的记事本', debug=False, bootloader_ignore_signals=False, strip=False, upx=True,# 需要先安装 UPX
console=False,# GUI 程序设为 False
disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon='app.ico',
)
pip install nuitka
# 最常用命令(单文件 + 优化)
python -m nuitka \
--standalone \
--onefile \
--windows-disable-console \
--include-package-data=tkinter \
--windows-icon-from-ico=app.ico \
--output-dir=dist \
main.py
Nuitka vs PyInstaller 启动速度对比(实测平均值):
| 需求 | 推荐工具 | 一句话命令建议 |
|---|---|---|
| 最简单、最稳 | PyInstaller | pyinstaller -F --windowed --name=MyApp main.py |
| 启动速度最重要 | Nuitka | python -m nuitka --onefile --windows-disable-console main.py |
| 体积最小 | Nuitka + UPX | 加 --enable-plugin=upx |
| 有大量第三方库(pandas 等) | PyInstaller | 先用 --onedir 测试,再转单文件 |
| 需要开控制台(命令行工具) | PyInstaller | 去掉 --windowed / --noconsole |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online