Python 打包保姆级教程:PyInstaller、Nuitka、cx_Freeze 命令与参数

2026-03-02

Python 打包(Packaging)指将 Python 脚本或项目发布为可独立运行的可执行文件(如 .exe)或可分发的包(如 .whl、源码包)。本文介绍 PyInstaller、Nuitka、cx_Freeze 等主流工具的安装、命令、核心参数与保姆级用法,帮助你将 Python 程序分发给无 Python 环境的用户。

一、Python 打包工具对比

按目标产物分类:生成独立可执行文件(单文件/目录)与生成可分发包(wheel、源码包)。以下为常用工具对比如下。

工具产物类型跨平台体积启动速度适用场景
PyInstallerexe / 单文件/目录Windows / Linux / macOS较大中等桌面应用、脚本分发、快速打包
Nuitkaexe / 单文件/目录同上较小(编译优化)较快追求体积与性能、商业发布
cx_Freezeexe / 目录同上中等中等多平台、配置灵活
py2exeexe / 目录仅 Windows中等中等仅 Windows 目标
setuptools + wheel.whl / .tar.gz通用源码级N/A库发布、pip 安装

数据来源:各工具官方文档与 PyPI 统计(综合整理)。

二、PyInstaller:安装与常用命令

PyInstaller 是使用最广泛的 Python 打包工具,支持单文件、目录打包与多平台。安装与基础命令如下。

2.1 安装

pip install pyinstaller

2.2 基础打包命令

以下为最常用的三种形式:

命令说明产物
pyinstaller main.py默认目录模式dist/main/ 目录 + 可执行文件
pyinstaller -F main.py单文件模式dist/main.exe(或 main)
pyinstaller -D main.py显式目录模式(默认)dist/main/ 目录

2.3 PyInstaller 核心参数一览

参数简写说明示例
--onefile-F生成单个可执行文件-F main.py
--onedir-D生成目录(默认)-D main.py
--name-n指定输出名称-n MyApp main.py
--specpathspec 文件输出目录--specpath ./build
--workpath临时文件目录--workpath ./build
--distpath可执行文件输出目录--distpath ./dist
--add-data添加数据文件(源;目标)--add-data "config.json;."
--add-binary添加二进制文件--add-binary "lib.dll;."
--hidden-import隐式导入的模块--hidden-import pkg.mod
--collect-all收集整个包--collect-all pandas
--noconfirm-y覆盖输出不确认-y
--clean清理缓存再打包--clean
--noconsole-w无控制台窗口(GUI)-w main.py
--console-c显示控制台(默认)-c main.py
--icon-i指定图标-i app.ico main.py
--uac-admin请求管理员权限(Windows)--uac-admin
--key加密 Python 字节码密钥--key 12345

路径分隔符:Windows 用 ;,Linux/macOS 用 :。可写 spec 文件做复杂配置。

三、PyInstaller 保姆级示例

按常见场景给出完整命令示例。

3.1 单文件打包(控制台程序)

pyinstaller -F -n MyScript main.py

生成 dist/MyScript.exe(Windows)或 dist/MyScript(Linux/macOS)。

3.2 GUI 程序(无控制台)

pyinstaller -F -w -i app.ico -n MyGUI main.py

单文件、无控制台、指定图标。

3.3 带数据文件

# Windows
pyinstaller -F --add-data "config.json;." --add-data "templates;templates" main.py

# Linux / macOS
pyinstaller -F --add-data "config.json:." --add-data "templates:templates" main.py

将 config.json 和 templates 目录打进包,运行时通过 sys._MEIPASS 访问。

3.4 隐式导入与大型库

pyinstaller -F --hidden-import pandas --hidden-import sklearn.utils._cython_blas --collect-all pandas main.py

解决动态导入、C 扩展等未自动收集的问题。

3.5 完整生产级命令示例

pyinstaller -F -w -y --clean \
  -n MyApp \
  -i icon.ico \
  --add-data "config.json;." \
  --hidden-import pkg.mod \
  --distpath ./release \
  main.py

四、Nuitka:安装与常用命令

Nuitka 将 Python 编译为 C,再编译为原生二进制,体积与启动速度通常优于 PyInstaller。需安装 C 编译器(如 MSVC、GCC、Clang)。

4.1 安装

pip install nuitka

4.2 Nuitka 核心参数

参数说明示例
--onefile单文件输出--onefile main.py
--standalone独立运行(含依赖)--standalone main.py
--output-dir输出目录--output-dir=dist
--output-filename输出文件名--output-filename=MyApp.exe
--include-data-dir包含数据目录--include-data-dir=./assets=assets
--include-data-files包含数据文件--include-data-files=config.json=.
--enable-plugin启用插件--enable-plugin=numpy
--nofollow-import-to排除模块--nofollow-import-to=test
--windows-disable-console无控制台(Windows)--windows-disable-console
--windows-icon-from-ico设置图标--windows-icon-from-ico=app.ico

4.3 Nuitka 示例命令

python -m nuitka --standalone --onefile --output-dir=dist --output-filename=MyApp.exe --windows-disable-console main.py

五、cx_Freeze:安装与常用命令

cx_Freeze 跨平台、配置灵活,常用 setup.py 或 setup.cfg 定义打包。也支持命令行。

5.1 安装

pip install cx_Freeze

5.2 命令行打包

cxfreeze main.py --target-dir=dist

5.3 setup.py 配置示例

from cx_Freeze import setup, Executable

setup(
  name="MyApp",
  version="1.0",
  executables=[Executable(
    "main.py",
    target_name="MyApp",
    icon="app.ico",
    base="Win32GUI"  # 无控制台,仅 Windows
  )],
  options={
    "build_exe": {
      "packages": ["pandas"],
      "include_files": [("config.json", "config.json")],
    }
  }
)

执行:python setup.py build

六、工具选型要素权重

基于实际打包项目经验,选型时以下要素的影响程度(相对权重,满分 100):

目标平台兼容性
95%
依赖收集完整性
92%
产物体积与启动速度
85%
配置复杂度
78%

说明:权重基于 Python 打包项目实践归纳,仅供参考。

七、setuptools 与 wheel:库发布

若目标是发布为 pip 可安装的库,使用 setuptools + wheel 打包源码包与 wheel。

pip install build
python -m build

或:

python setup.py sdist bdist_wheel

生成 dist/*.whl 与 dist/*.tar.gz,可上传 PyPI。若需将 Python 应用打包进 CI/CD,可参考本站《CI/CD 与持续交付实践》。

八、小结

Python 打包可根据目标选择 PyInstaller(快速上手)、Nuitka(性能与体积)、cx_Freeze(配置灵活)或 setuptools(库发布)。PyInstaller 的 -F、-w、--add-data、--hidden-import 等参数覆盖多数桌面应用场景;遇动态导入或大型库可结合 --collect-all 与 spec 文件。若需自动化构建与发布,可接入 CI/CD;若部署为 Serverless 或云函数,可阅读《Serverless 架构实践指南》。