为 Python 应用制作 Windows 安装程序(从 PyInstaller 到 Setup.exe)
用 PyInstaller 冻结 Python 程序,再把输出打包成带快捷方式和卸载程序的正规 Windows 安装程序。为什么做安装程序时 onedir 优于 onefile,以及哪些设置最关键。
更新于 2026年10月31日 · 阅读约 4 分钟
PyInstaller 能把 Python 程序变成无需安装 Python 就能运行的 Windows .exe。但它不负责安装这个程序:没有开始菜单项,没有卸载程序,Windows 设置里也看不到它。要做到这些,就得把 PyInstaller 的输出包进一个安装程序。下面是从脚本到 Setup.exe 的完整流程。
第 1 步:用 PyInstaller 冻结应用
在项目环境中安装 PyInstaller,然后在入口脚本所在的文件夹里执行构建:
pip install pyinstaller
pyinstaller --noconsole --onedir --name MyApp --icon app.ico main.py
各参数的作用:
--onedir(默认值)生成dist/MyApp/文件夹,里面有MyApp.exe和存放库文件的_internal/文件夹。做安装程序请用这种模式。它比--onefile启动更快,因为每次启动都不需要把内容解压到临时文件夹,也更不容易引起杀毒软件启发式扫描的注意。--noconsole会隐藏图形界面应用(Tkinter、PyQt、Kivy 等)的黑色控制台窗口。命令行工具不要加这个参数。--icon app.ico把图标嵌入.exe。安装程序请沿用同一个.ico。--name MyApp指定可执行文件和输出文件夹的名称。
程序运行时要打开的数据文件(图片、配置模板、模型等)必须通过 --add-data "src;dest" 或在 .spec 文件中添加,否则不会出现在 dist/MyApp/ 里。
打开 dist/MyApp/MyApp.exe,确认应用能正常运行。如果条件允许,把整个 dist/MyApp 文件夹复制到另一台没有安装 Python 的 Windows 电脑上,也运行一遍。
第 2 步:把输出文件夹打成 zip
把 dist/MyApp/ 的内容打成 zip:MyApp.exe 和 _internal/。不要把 build/、.spec 文件或源码目录放进去。安装的就是这个 zip 里的内容,逐字节一致。
第 3 步:构建安装程序
- 把 zip 上传到 ExeTup。它会把
MyApp.exe识别为主程序。 - 填写应用名称、版本、发布者,以及可选的许可协议。
- 选择所有用户(Program Files,需要管理员授权)或当前用户(无需管理员权限)。分发给同事使用的工具通常按用户安装更合适。
- 选择架构。PyInstaller 按运行它的 Python 来构建,64 位 Python 生成的就是 64 位应用。
- 上传
app.ico,打开需要的快捷方式,然后开始构建。 - 下载
Setup.exe,在 Windows 上测试。
Python 专属注意事项
- 杀毒软件误报。 PyInstaller 打包的程序经常被过于谨慎的杀毒软件启发式扫描盯上,尤其是
--onefile构建。放在普通安装程序里、安装到 Program Files 的 onedir 构建和其他程序没有两样,被标记的可能性更低。代码签名能进一步改善。 - 体积。 Tkinter 应用通常 20 到 40 MB;PyQt、NumPy 或 PyTorch 会让体积大得多。安装程序的 LZMA 压缩通常能把体积减半。用
--exclude-module排除用不到的模块,保持精简。 - 首次启动。 因为 onedir 不需要解压,首次启动和之后的启动一样快。
- 更新。 发布一个版本号更高的新安装程序。覆盖安装到上一个版本上会就地替换文件。
- 控制台工具。 对于命令行程序,可以考虑按机器安装,并告诉用户安装文件夹的位置;安装程序不会把它加入
PATH。
其他方案
Nuitka 和 cx_Freeze 同样会生成一个带 .exe 的文件夹,安装程序这一步完全相同。如果你想自己编写安装脚本,NSIS 和 Inno Setup 都能处理 PyInstaller 的输出。
常见问题
做安装程序该用 --onefile 还是 --onedir?
--onedir。安装程序已经让用户只需下载一个 Setup.exe,没有理由再承受 onefile 启动慢、要往临时文件夹解压的代价。而且 onedir 本来就是 PyInstaller 的默认值。
用户需要安装 Python 吗?
不需要。PyInstaller 把 Python 解释器和库都打包进了文件夹,安装程序再把这个文件夹放到用户的电脑上。
为什么 Windows 会对我的安装程序发出警告?
新发布且未签名的下载文件在积累信誉之前会触发 Microsoft SmartScreen。可以采取的措施请看 SmartScreen 指南。
可以附带示例配置或数据文件夹吗?
可以。既可以用 PyInstaller 的 --add-data 添加,这样它会放在 _internal/ 里;也可以在 ExeTup 的“其他文件”步骤中添加,放到 MyApp.exe 旁边。
相关指南
- 如何为 Windows 应用制作 Setup.exe(无需编写代码)了解 Setup.exe 实际做了什么、制作安装程序的三种方式,以及如何无需编写安装脚本,几分钟内把应用文件夹变成专业的安装程序。
- 将 .exe 转换为 Windows 安装程序(exe 转 Setup.exe)如何把一个普通的 .exe,或者包含 .exe 的文件夹,转换为带快捷方式和卸载程序的真正 Windows 安装程序,无需编写安装脚本。
- '"Windows 已保护你的电脑":SmartScreen 警告是什么意思,怎样消除'为什么 Windows 会对新安装程序显示"未知发布者"警告,用户可以点什么,以及代码签名和信誉如何让警告消失。