跳到正文

为 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 步:构建安装程序

  1. 把 zip 上传到 ExeTup。它会把 MyApp.exe 识别为主程序。
  2. 填写应用名称、版本、发布者,以及可选的许可协议。
  3. 选择所有用户(Program Files,需要管理员授权)或当前用户(无需管理员权限)。分发给同事使用的工具通常按用户安装更合适。
  4. 选择架构。PyInstaller 按运行它的 Python 来构建,64 位 Python 生成的就是 64 位应用。
  5. 上传 app.ico,打开需要的快捷方式,然后开始构建。
  6. 下载 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 旁边。

相关指南