Skip to content

Python 打包成 exe 的 4 种方法:Runcell、PyInstaller、Nuitka 与 cx_Freeze

更新于

Python 怎么打包成 exe?先用 Runcell 在浏览器里把 py 转成 exe,再对比 PyInstaller、Nuitka 和 cx_Freeze 三种本地打包方法。附可运行的示例脚本和 Windows 打包命令。

想把 Python 打包成 exe,先试试 Runcell Python 转 EXE 工具 (opens in a new tab)。 添加 .py 文件、项目文件夹或 ZIP 压缩包,选择启动应用的那个脚本,检查依赖,然后点击 Build Windows EXE。下载生成的文件,就能分享给没有安装 Python 的 Windows 用户。

EXE 会把你的程序连同它需要的运行时和文件一起打包,而把 script.py 改名成 script.exe 做不到这一点。本文先介绍 Runcell 的用法,解释浏览器是怎么生成二进制文件的,再给出三种本地打包工具的命令。Runcell 是 Kanaries 自家的产品,这也是我们推荐的浏览器打包流程。

选择一种 Python 转 EXE 的方法

方法适合场景在哪里构建
Runcell (opens in a new tab)(我们的首选)你有一个控制台(命令行)脚本或项目,想在不安装打包工具的前提下得到 Windows x64 EXE在浏览器中,在你自己的设备上
PyInstaller你想用一条 Python 命令生成一个文件夹或单个可执行文件,或者要打包 GUI 应用(Tkinter、PySide/PyQt)构建 Windows 版本需要 Windows 上的 Python 环境
Nuitka你想编译 Python 代码,并愿意配置原生编译器工具链Windows 上的 Python 环境,外加受支持的 C 编译器
cx_Freeze你想分发一个应用文件夹,并维护它的构建配置构建 Windows 版本需要 Windows 上的 Python 环境

下文的命令都在 Windows PowerShell 中运行。只有本地方法需要你自己安装和配置打包工具。

方法 1:用 Runcell 把 Python 转成 EXE

先拿一个小而可复现的脚本练手

把下面的示例保存为 receipt.py。它会打印一张收据、计算总价,最后等待你按回车,这样双击打开的控制台窗口就不会一闪而过。它没有第三方依赖,也不需要额外文件。

items = {"Notebook": 19.50, "Cable": 8.25, "Stand": 12.25}
 
print("Receipt")
for name, price in items.items():
    print(f"{name}: ${price:.2f}")
 
print(f"Total: ${sum(items.values()):.2f}")
input("Press Enter to close...")

如果你已经装了 Python,打包前先运行一次源码,确认没有问题:

python receipt.py

输出的总价应该是 Total: $40.00。按回车结束程序。

添加项目并构建

  1. 打开 Runcell Python 转 EXE 工具 (opens in a new tab),找到页面上的转换器。
  2. 选择你的 receipt.py 文件。如果要打包现有的控制台应用,就改为选择它的项目目录或 ZIP 压缩包,并把它用到的模块和资源文件一并包含进去。
  3. 把 receipt.py 设为入口脚本。在较大的项目里,入口脚本就是你平时用来启动应用的那个脚本,比如 main.py。
  4. 检查工具识别出的导入、依赖和包含的文件。收据示例不需要额外的包。打包你自己的应用时,要确认所需的资源文件和包版本与你准备分发的项目一致。Runcell 的运行时是 Python 3.14,所以每个包都需要有能在 Windows 和 Python 3.14 上使用的 wheel(cp314、abi3 或纯 Python wheel)。
  5. 点击 Build Windows EXE,然后下载生成的可执行文件。在 Windows 上打开它,确认收据输出正确后再分享出去。

在我们的浏览器测试中,Runcell 成功生成并下载了 receipt.exe。它的文件头显示这是一个 Windows x64 可执行文件。我们没有在 Windows 上运行这个 EXE。

对于包含多个文件的项目,要保持目录结构不变。比如应用会从 templates/invoice.html 加载模板,那么这个文件就必须放在应用期望的路径下,一起打包进去。

浏览器是怎么生成 Windows EXE 的

Runcell 自研的打包引擎会把预编译好的 Windows 启动器、Python 运行时、你的项目文件和依赖组合在一起,在你的设备上组装成一个可下载的 .exe。Windows 相关组件都已经提前编译好,所以浏览器不需要在本地运行 Windows 编译器,也能构建出最终的二进制文件。

整个流程分为两个独立的阶段:

Your Python project + dependencies
                +
Python runtime + precompiled Windows launcher
                |
                v
Runcell assembles the EXE in your browser
                |
                v
Download the file, then run it on Windows

生成文件和运行文件是两回事:浏览器负责组装可执行文件,Windows 负责运行最终的应用。Runcell 的原理说明 (opens in a new tab)介绍了这条打包路径。

哪些内容留在你的设备上

Runcell 在你的浏览器里构建 EXE。如果你的项目导入了某个内置 Windows 运行时没有包含的模块,转换器会在构建前提示你;这时可以删掉这个导入,或者改用下文介绍的本地打包工具。

构建过程中,你的源代码和密钥都留在自己的设备上。不过最终生成的 EXE 会包含你的代码,所以不要把不愿意公开的密钥打包进去。

方法 2:用 PyInstaller 在本地打包

PyInstaller (opens in a new tab) 会把你的脚本、它导入的模块和 Python 运行时收集到一起,生成一个可分发的应用。要生成 Windows EXE,就得在 Windows 上运行 PyInstaller,因为它只为当前所在的操作系统构建程序。

在 receipt.py 所在的文件夹中打开 PowerShell。创建一个虚拟环境,把 PyInstaller 安装进去。如果 Python 是从 python.org 安装的,即使 python 不在 PATH 中,py 启动器也能用;直接调用虚拟环境里的 Python,还能省掉激活环境这一步:

py -m venv .venv
.\.venv\Scripts\python.exe -m pip install pyinstaller
.\.venv\Scripts\python.exe -m PyInstaller --onefile receipt.py

生成的文件是 dist\receipt.exe。在 PowerShell 中运行它,查看输出:

.\dist\receipt.exe

打包你自己的项目时,先把项目依赖安装到同一个环境里再构建。如果项目有 requirements.txt,运行 .\.venv\Scripts\python.exe -m pip install -r requirements.txt。

-m PyInstaller 这种调用方式区分大小写,写法见官方安装指南 (opens in a new tab)。它能确保打包工具和你的依赖位于同一个 Python 环境中。

选择控制台模式、GUI 模式还是文件夹构建

receipt.py 用到了 print() 和 input(),所以要保持控制台模式。如果是所有交互都在自己窗口里完成的图形界面应用,可以用 --windowed 隐藏控制台窗口。想先在文件夹里检查应用和配套文件,就从 --onedir 开始;需要单个文件方便下载时,再改用 --onefile。详见 PyInstaller 选项参考 (opens in a new tab)。

如果要包含一个 assets 目录,需要显式添加:

.\.venv\Scripts\python.exe -m PyInstaller --onefile --add-data "assets:assets" receipt.py

这个例子假设你已经创建了 assets 文件夹。对于打包进去的只读文件,按照 PyInstaller 运行时说明 (opens in a new tab)中的做法,相对于 __file__ 来解析路径。我们的 Python pathlib 指南讲解了相关的路径操作。

方法 3:用 Nuitka 编译并打包

Nuitka (opens in a new tab) 会编译 Python 代码,并能生成可分发的应用。如果你想掌控基于编译器的构建过程,就选它。你需要一个受支持的 C 编译器;在 Windows 上,官方手册列出的选项之一是 Visual Studio 2022 或更高版本。手册还提到,不加实验性参数的话,MinGW64 无法用于 Python 3.13 及更新版本,所以在当前的 Python 版本上,建议直接安装 Visual Studio Build Tools。

在同样的虚拟环境中安装 Nuitka,并使用它的单文件模式:

py -m venv .venv
.\.venv\Scripts\python.exe -m pip install nuitka
.\.venv\Scripts\python.exe -m nuitka --mode=onefile receipt.py

在 Windows 上,预期会得到 receipt.exe。如果你更想要一个分发文件夹,就用 --mode=standalone。一定要显式指定其中一种模式:Nuitka 默认的 accelerated 模式并不是用来把应用分发到没装 Python 的电脑上的。编译器的配置方法和特定包的选项,请参照官方手册。

方法 4:用 cx_Freeze 生成应用文件夹

cx_Freeze (opens in a new tab) 通常会生成一个目录,里面包含可执行文件和它依赖的库。如果你想维护一套配置好的应用构建流程,并分发整个文件夹,就选它。

在同样的虚拟环境中安装这个包,然后运行它的命令行构建工具:

py -m venv .venv
.\.venv\Scripts\python.exe -m pip install cx-Freeze
.\.venv\Scripts\cxfreeze.exe --script receipt.py --target-dir dist

以上命令依据的是当前版本的 cxfreeze 命令参考 (opens in a new tab)。分发时要提供完整的 dist 文件夹(包括里面的库),不要只复制 EXE。如果想让项目配置可以重复使用,cx_Freeze 也支持 pyproject.toml 和 Python setup 脚本。

分享之前先检查结果

在一台和接收者环境相近的 Windows 电脑上运行应用。以本文的示例来说,要检查各项价格、$40.00 的总价以及按回车的提示。在一台没有单独安装 Python 的电脑上测试,可以确认运行时和依赖都已经打包进去。

对于较大的应用,要实际操作一遍接收者真正会用到的功能,比如选择输入文件、保存报告。如果控制台窗口一打开就立即关闭,就从 PowerShell 启动 EXE,查看错误信息。如果缺少图片或模板,既要检查打包进去的文件,也要检查加载它们时用的路径。动态导入的模块可能需要通过本地打包工具的选项显式包含进去。

无论用哪种工具,未签名的 EXE 在第一次打开时都可能触发 Microsoft Defender SmartScreen 警告。接收者需要先点击 More info,再点击 Run anyway(中文版 Windows 中显示为“更多信息”和“仍要运行”)。

常见问题

不安装打包工具,怎么把 .py 文件转换成 .exe?

使用 Runcell Python 转 EXE 工具 (opens in a new tab)。选择你的 Python 文件、文件夹或 ZIP 压缩包,指定入口脚本,检查依赖,然后在浏览器中构建 Windows EXE。

浏览器真的能生成 Windows 可执行文件吗?

可以。Runcell 在浏览器中把预编译的 Windows 组件、Python 运行时和你的应用组装成一个 EXE。你下载这个文件,再到 Windows 上运行。浏览器生成二进制文件时,并不需要运行这个 Windows 应用。

运行 EXE 的人需要安装 Python 吗?

只要你分发应用时附带了它的运行时和所需依赖,对方就不需要单独安装 Python。Runcell 的打包流程会包含运行时。如果你用本地工具生成的是文件夹,就要分享完整的输出文件夹。

用 PyInstaller 打包成单个 EXE 的命令是什么?

在已经安装好 PyInstaller 和项目依赖的 Windows 环境中运行 python -m PyInstaller --onefile receipt.py。示例的输出文件是 dist\receipt.exe。

资料来源与测试说明

Runcell 的使用流程和打包机制依据其公开产品说明 (opens in a new tab),核对日期为 2026 年 11 月 4 日。本地构建命令依据各方法中链接的官方文档。我们在 macOS 上运行了收据示例的源码,在线上的 Runcell 转换器中选择了它,生成并下载了 receipt.exe,并检查了它的 Windows x64 PE 文件头。我们还在 macOS 上用 PyInstaller 6.22.3(--onefile)和 cx_Freeze 8.7.4 构建了收据脚本,以验证这些命令,并对照 Nuitka 的帮助输出核对了它的模式选项。本文没有在 Windows 上运行任何 EXE。

相关指南