一、为什么要打包成 exe
你写好的 .py 文件,在别人电脑上不一定能直接运行:
对方必须也装了 Python,还要用对版本、用对方式打开。打包就是把程序和它所依赖的 Python 环境一起装进一个文件,
变成一个双击就能用的可执行程序(Windows 上是 .exe)。
| 对比项 | 直接发 .py 文件 | 打包成 exe |
|---|---|---|
| 对方要不要装 Python | 要,还必须版本差不多 | 不用,双击就能跑 |
| 怎么打开 | 右键「用 IDLE / Python 打开」,容易点错 | 双击,和普通软件一样 |
| 文件大小 | 几 KB | 几十 MB(把 Python 一起打进去了) |
| 能不能跨系统 | 装了 Python 就能跑 | Windows 打的包只能在 Windows 上跑 |
一句话理解:打包相当于把你的程序连同 Python 一起打包带走, 代价就是体积变大、启动稍微慢一点。
.py 就够了,不必每次都打包。课程思政|科技自立自强 · 让程序离开你的电脑
打包的意义,是把程序和它依赖的 Python 环境一起装进一个文件,让它不再依赖对方装没装、装得对不对,双击就能运行。我们写代码,工具链却大多来自国外,而像 TRAE 这样的国产 AI 编程工具,如今已经能陪你走完从写代码到打包的整条路。国产工具好不好用,用过、比过、提过意见,才算真了解。
二、准备工作:Python、pip 和 PyInstaller
打包需要三样东西就位:Python(已经装好了)、pip(跟着 Python 一起装上的包管理工具)、 PyInstaller(专门负责打包的第三方库)。
1. 在 TRAE 里打开终端
按 Ctrl 加键盘左上角 Esc 下面的反引号键,底部会弹出一块终端;
也可以在菜单里点 终端 → 新建终端。后面所有命令都在这里敲。
2. 确认 Python 装好了
python --version
出现版本号就说明没问题。3. 后面是你的小版本号,
你电脑上具体是哪个,都不影响后面的操作:
Python 3.<小版本号>
3. 安装 PyInstaller
pip 是 Python 自带的安装工具,用它装 PyInstaller 只要一条命令:
pip install pyinstaller
终端里会刷出几行安装信息,最后一行以 Successfully installed 开头,就说明装好了。
想再确认一次,可以敲 pyinstaller --version,能打印出版本号(例如 6.<小版本号>)就对了。
pip 是命令,不是 Python 代码,别写进 .py 文件里;命令一律在终端里敲。三、让 TRAE 自动打包
不想记命令也行,TRAE 的 AI 可以直接帮你搞定。它有两种方式。
方式 A:行内对话(Ctrl + I)
- 把光标放在要打包的
.py文件里; - 按
Ctrl + I; - 输入 「把这个文件打包成单个 exe 文件」;
- AI 会给出打包命令,有的版本还能直接帮你执行。
方式 B:侧边对话(Ctrl + U)
- 先把文件添加到对话(选中代码 → 点「添加到对话」);
- 在侧边对话框里输入 「帮我把这个程序用 PyInstaller 打包成单个 exe,并说明每条参数的意思」;
- AI 会给出命令,还会解释
--onefile、--windowed各是什么意思。
课程思政|诚信与职业操守 · 让 AI 顺手把道理讲清楚
你可以直接让 TRAE 给出打包命令、甚至替你执行,省事是真省事。但更好的用法,是顺口加一句「说明每条参数是什么意思」:--onefile 为什么生成单文件、--windowed 为什么没有黑窗,弄懂了下次不问也能自己敲。AI 是陪你练的陪练,不是替你交差的枪手,每次提问都该变成自己长本事的机会。
四、手动执行打包命令
命令其实很简单,会一条就够用。假设我们的程序 hello.py 是这么一个小程序(帮同学算奶茶钱):
# 帮同学算奶茶钱:每杯 12 元,一共买 2 杯,另加 3 元打包费
price = 12
cups = 2
total = price * cups + 3
print(f"{cups} 杯奶茶一共 {total} 元")
先用 Python 跑一遍,确认程序本身没问题,输出是:
2 杯奶茶一共 27 元
然后回到终端,先进入文件所在的文件夹,再执行打包命令:
cd C:\你的练习文件夹\python_study
pyinstaller --onefile hello.py
终端会刷出一大串 INFO 开头的日志,这是正常的。
看到最后出现 Building EXE ... completed successfully,就说明打包成功了。
换个名字、加个图标
参数可以叠着用。下面这条把程序名改成「奶茶计算器」,并给它指定一个图标:
pyinstaller --onefile --name 奶茶计算器 --icon=myicon.ico hello.py
这条命令的意思是:打成单个文件、名字叫「奶茶计算器」、用 myicon.ico 当图标。
--windowed——加了黑窗被隐藏,就什么都看不到了。它留给图形界面程序用。五、打包结果在哪里找
打包完后,你的文件夹会多出三样东西:
python_study/
├─ hello.py ← 你写的源文件,还在
├─ dist/
│ └─ hello.exe ← 要发给别人的成品
├─ build/
└─ hello.spec
| 位置 | 是什么 | 能不能删 |
|---|---|---|
dist/ | 打包好的成品,exe 就在里面 | 不能删,这就是你要的东西 |
build/ | 打包过程中的临时文件 | 可以删,下次打包会重新生成 |
hello.spec | 打包配置单,记录了这次的参数 | 可以删,删了按默认参数重打 |
dist 里的那个 exe(用 --onefile 时是一个文件)。别把整个项目文件夹发过去,那里面还有源文件和一堆没用的中间文件。AI 助手小贴士|打包参数里藏着「单文件为什么启动慢」的原理。
打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:pyinstaller 的 -F 参数打成单文件后,为什么第一次启动特别慢?临时解包目录是怎么回事?
六、常用打包参数一览
常用的就下面这几个,用不到的不必记。
| 参数 | 简写 | 作用 |
|---|---|---|
--onefile | -F | 打包成单个 exe(默认是打成一个文件夹) |
--windowed | -w | 运行时不显示黑色命令行窗口,图形界面程序用它 |
--icon=图标.ico | -i | 给程序指定图标 |
--name 名字 | -n | 指定打包出来的程序叫什么名字 |
--console | -c | 保留命令行窗口(这是默认行为) |
--clean | — | 打包前先清掉上次的临时文件 |
--noconfirm | -y | 直接覆盖上次的结果,不再询问 |
--add-data 源;目标 | — | 把额外的数据文件一起打进去(Windows 用分号分隔) |
.ico 文件,把 png 直接改后缀成 .ico 是不行的,打包后图标不会生效。另外 --add-data 的分隔符各系统不同:Windows 用分号 ;,macOS / Linux 用冒号 :。七、把程序发给别人
- 只发 dist 里的成品:用
--onefile打包时,就是dist里那一个exe; 没加这个参数时,dist 里是一个文件夹,要整个文件夹一起发。 - 对方不用装 Python:这正是打包的意义。
- 系统要对得上:Windows 上打的包只能在 Windows 上跑,macOS 上打的包只能在 macOS 上跑。
- 体积大是正常的:几十 MB 很正常,因为 Python 解释器被一起装进去了。
课程思政|数据安全与法治素养 · 交付之前,先清一遍目录
打包好要发给别人时,最常见的错是图省事,把整个项目文件夹一股脑发过去——里面可能还躺着测试用的成绩数据、写着账号的配置文件。发出去的东西就像寄快递,外面的光鲜不算数,得先确认夹层里没塞不该带的东西。养成交付前先清一遍目录的习惯,是对别人、也是对数据负责。
八、打包常见报错与排查
打包本身很少出错,出问题大多卡在下面这几处。
| 现象 | 原因 | 怎么处理 |
|---|---|---|
| 双击 exe 窗口一闪就没了 | 程序启动时就报错了,只是窗口立刻关闭,你来不及看 | 先用 pyinstaller --console hello.py 重新打包,再到终端里运行 dist 里的程序,报错就会显示出来 |
| 提示 'pyinstaller' 不是内部或外部命令 | PyInstaller 没装好,或者装的目录不在 PATH 里 | 先 pip install pyinstaller;仍然不行就用 python -m PyInstaller --onefile hello.py 来跑 |
运行时提示 ModuleNotFoundError | 程序用到的第三方库没被打进去 | 在终端里 pip install 那个库,装好后重新打包一次 |
| 图标没生效 | 图标不是真正的 .ico,或文件名拼错了 | 用工具把图片转成规范的 .ico,并核对文件名与路径 |
| exe 被杀毒软件拦截 | 自制的小程序容易被误判 | 把 exe 加入杀毒软件白名单;发给别人时也提醒对方加白名单 |
| 控制台里中文显示乱码 | 命令行窗口的编码不是 UTF-8 | 在终端里先执行 chcp 65001 切到 UTF-8,再运行程序 |
AI 助手小贴士|打包的场景坑各不相同,练「先说思路」。
打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:出 3 道打包场景题:exe 在别人电脑报缺模块、自定义图标不生效、被杀毒软件误报。让我先说排查思路,你再补充
九、常见问题
- 打包一次要多久:第一次比较慢(几十秒到一两分钟),之后会快很多,属正常。
- build 目录和 .spec 文件能不能删:能。它们只是中间产物,
dist里的成品别删。 - 能不能在 Mac 上打出 Windows 用的包:不能直接打。打包出来的程序只认同一种系统; 要给 Windows 用户,就在 Windows 电脑上打包。
- 同学收到 exe 打不开:常见三个原因——杀毒软件拦截、系统版本差太多、 或者你用了默认模式(打成文件夹)却只发了里面的 exe。先确认发的是完整的成品。
- 改完程序怎么办:改完
.py、存盘,再执行一次打包命令, 用dist里新生成的文件覆盖旧的就行。 - 打包报错看不懂:把报错的最后一行复制给 TRAE 的 AI(
Ctrl + U), 它能告诉你缺什么、该补哪一步。
AI 助手小贴士|打包是全课程报错最密集的一关,「双击闪退」尤其迷惑。让 AI 给你一份排查清单,照着逐条试。
打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:pyinstaller 打包成功,但双击 exe 闪退。请列出最常见的 5 个原因和对应的排查命令(包括怎么在命令行运行 exe 看到报错)
十、随堂自测(12 题)
点击选项即可判分,答错的题会立刻显示解析。全部答完后会给出正确率和错题清单。
1把 .py 打包成 exe,最主要的好处是?
- A. 对方电脑不用装 Python,双击 exe 就能运行
- B. 程序运行速度会快很多
- C. exe 文件比 py 文件小很多
- D. 打包之后程序就永远不会报错了
2安装 PyInstaller 用哪条命令?
- A. pip install pyinstaller
- B. python install pyinstaller
- C. install pyinstaller
- D. pip uninstall pyinstaller
3打包参数 --onefile(或 -F)的作用是?
- A. 只处理一个 .py 文件,忽略其它文件
- B. 把程序打包成单个 exe 文件
- C. 打包时只运行一次程序
- D. 打包后自动删除源文件
4打包完成后,要发给别人的 exe 在哪个位置?
- A. build 目录
- B. 项目最外层目录
- C. dist 目录
- D. hello.spec 文件里
5想让窗口程序不弹出黑色命令行窗口,应该加哪个参数?
- A. --console
- B. --clean
- C. --noconfirm
- D. --windowed(或 -w)
6在 TRAE 里打开底部终端,快捷键是?
- A. Ctrl + U
- B. Ctrl 加上键盘左上角 Esc 下面的反引号键
- C. Ctrl + I
- D. Ctrl + S
7打包出来的 exe 体积有几十 MB,这说明?
- A. 程序写得有问题,需要立刻优化
- B. 电脑中毒了
- C. 正常现象,因为 Python 解释器被打包进去了
- D. 说明打包失败了
8双击 exe 时窗口一闪就没了,最可能的原因和排查办法是?
- A. 程序在启动时出错了;可以先用 --console 打包,再到终端里运行,就能看到具体报错
- B. 电脑内存不够,换台电脑就行
- C. 必须重启电脑才能运行
- D. exe 损坏了,要重新安装 Python
9在 Mac 上打好的包,能直接发给用 Windows 的同学吗?
- A. 能,exe 文件是通用的
- B. 不能,打包出来的程序只能在打包时所用的同一种系统上运行
- C. 能,只要把文件名改成 .exe
- D. 能,但同学要先装 Python
10终端提示 'pyinstaller' 不是内部或外部命令,应该怎么办?
- A. 重启 TRAE
- B. 把程序改名为 pyinstaller.py
- C. 换一台电脑
- D. 先执行 pip install pyinstaller 装上它;仍然不行就用 python -m PyInstaller 来跑
11关于打包产生的 dist 目录、build 目录和 .spec 文件,下列说法正确的是?
- A. dist 可以删,build 和 .spec 不能删
- B. 三个都必须保留,删了 exe 就打不开了
- C. build 目录和 .spec 文件是中间产物,可以删;dist 里是成品,要留着
- D. 打包完成后源文件 hello.py 会被自动删掉
12程序改完之后,想让 exe 也更新,应该怎么做?
- A. 直接改 exe 的文件名就行
- B. exe 会自动同步,不用管
- C. 把旧的 exe 删掉再复制一份
- D. 重新执行一次打包命令,用 dist 里新生成的 exe 覆盖旧的