虽然 Python 本身是解释型语言,但借助工具可以将你的代码 + Python 解释器 + 依赖 打包成一个独立的 .exe(Windows)、.app(macOS)或 Linux 可执行文件,用户无需安装 Python 或任何依赖即可运行。
常见工具(推荐)
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Nuitka | 将 Python 编译为 C++ 再编译为原生二进制,性能好、体积小、支持 FastAPI/async | ✅ 强烈推荐用于 Web 服务(如你的 FastAPI 项目) |
| PyInstaller | 最流行,简单易用,但生成文件大、启动慢 | 桌面 GUI 应用、简单脚本 |
| cx_Freeze | 跨平台,稳定 | 中小型项目 |
| py2exe | 仅 Windows | 老项目 |
对于你的 FastAPI 后端服务,Nuitka 是目前最佳选择,因为它:
- 支持
async/await- 支持
uvicorn、fastapi、starlette- 生成的是真正的原生二进制(不是打包解释器)
- 启动快、内存占用低
示例:用 Nuitka 打包你的 FastAPI 项目
步骤 1:安装 Nuitka
pip install nuitka
步骤 2:确保入口文件清晰(如 main.py)
你的 main.py 应包含:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def hello():
return {"hello": "world"}
# 如果直接运行(非 uvicorn),需加:
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=False)
⚠️ 打包时 必须关闭
reload=True
步骤 3:打包命令(Windows 生成 .exe)
nuitka --standalone --onefile --enable-plugin=fastapi --output-dir=dist main.py
参数说明:
--standalone:包含所有依赖--onefile:打包成单个.exe文件(否则是文件夹)--enable-plugin=fastapi:自动处理 FastAPI 特殊依赖(如starlette的静态文件)--output-dir=dist:输出到dist/目录
💡 首次编译较慢(会调用本地 C++ 编译器,需安装 Microsoft C++ Build Tools)
步骤 4:运行结果
生成文件:
dist/
└── main.exe ← 双击或命令行运行即可!
用户只需运行:
./main.exe
→ 自动启动 FastAPI 服务(无需 Python 环境!)
注意事项
- 不能完全“加密”源码
虽然二进制难以反编译,但字符串、逻辑仍可能被提取。如需强保护,需额外混淆。 - 文件体积
即使--onefile,FastAPI + uvicorn 也会有 20~50MB(因包含 Python 解释器子集)。 - 跨平台需分别打包
Windows 上打包 → 只能在 Windows 运行
需在 macOS/Linux 上分别打包对应版本。 - 动态导入问题
如果你用__import__或插件系统,需手动指定隐藏模块:--include-module=your_dynamic_module
替代方案:Docker(更推荐用于服务部署)
如果你的目标是部署后端服务(而非分发给终端用户),Docker 比二进制包更合适:
FROM python:3.10-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
优势:
- 环境隔离
- 跨平台一致
- 易于扩展(Kubernetes)
- 无需编译
💡 结论:
- 给客户分发“绿色版 exe” → 用 Nuitka
- 服务器部署 → 用 Docker
总结
| 需求 | 推荐方案 |
|---|---|
打包 FastAPI 为单个 .exe | Nuitka(--onefile --enable-plugin=fastapi) |
| 快速打包简单脚本 | PyInstaller |
| 生产环境部署 | Docker |
| 完全隐藏源码 | 不可行(只能混淆) |