目前最主流、最推荐的工具是 PyInstaller,我会重点介绍它,并简要提及其他工具(如 cx_Freeze 和 py2exe)作为补充。

核心概念
在开始之前,需要理解几个关键概念:
-
解释型语言 vs. 编译型语言:
- 像 C/C++ 这样的编译型语言,源代码会直接编译成特定平台(如 Linux x86_64)的机器码,生成一个二进制可执行文件(
.exe或无后缀),这个文件不依赖任何解释器,可以直接运行。 - Python 是解释型语言,Python 脚本(
.py文件)本身不是机器码,而是文本,它需要一个 Python 解释器来读取和执行这些指令。
- 像 C/C++ 这样的编译型语言,源代码会直接编译成特定平台(如 Linux x86_64)的机器码,生成一个二进制可执行文件(
-
打包工具的作用:
- 打包工具(如 PyInstaller)的工作原理是:将你的 Python 脚本、它所依赖的所有库(第三方库和标准库)以及一个合适的 Python 解释器“捆绑”在一起,打包成一个单独的文件或文件夹。
- 这样,当用户运行这个打包后的文件时,程序会自动使用内置的解释器来执行你的脚本,无需用户提前安装 Python。
使用 PyInstaller (最推荐)
PyInstaller 是目前最流行、功能最强大的 Python 打包工具之一,它支持 Windows, macOS, 和 Linux,并且能很好地处理各种依赖项。

安装 PyInstaller
你需要安装它,使用 pip 即可:
pip install pyinstaller
准备一个简单的 Python 脚本
我们创建一个名为 my_app.py 的示例脚本,它不仅打印 "Hello, World!",还导入了一个第三方库 requests 来展示依赖处理能力。
my_app.py
import sys
import time
import requests
def main():
print(f"Hello, World from Python {sys.version_info.major}.{sys.version_info.minor}!")
print("正在请求一个网页...")
try:
response = requests.get('https://www.python.org', timeout=5)
print(f"成功请求 Python 官网,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
print("程序将在 3 秒后退出...")
time.sleep(3)
if __name__ == "__main__":
main()
打包成可执行文件
打开终端,进入 my_app.py 所在的目录,然后运行 PyInstaller 命令。

PyInstaller 提供了多种模式,最常用的是以下几种:
A. 单文件模式 (--onefile 或 -F)
这是最常见的需求,将所有东西打包成一个单独的文件。
pyinstaller --onefile my_app.py
- 工作过程: PyInstaller 会分析你的脚本,收集所有依赖,然后将它们压缩到一个可执行文件中。
- 输出文件: 打包完成后,会在
dist目录下生成一个名为my_app的文件(没有后缀)。 - 优点: 分发非常方便,只有一个文件。
- 缺点: 每次运行时,程序都需要先从文件中解压所有内容到一个临时目录,这会略微增加启动时间,并且在
/tmp目录下会留下临时文件。
B. 单目录模式 (--onedir 或 -D)
将所有依赖文件(解释器、动态链接库、数据文件等)放在一个文件夹中。
pyinstaller --onedir my_app.py
- 输出文件: 打包完成后,会在
dist目录下生成一个名为my_app的文件夹。 - 如何运行: 用户需要进入
my_app文件夹,然后执行其中的可执行文件./my_app。 - 优点: 启动速度快,因为无需解压。
- 缺点: 分发的是一个文件夹,而不是单个文件。
C. 添加图标 (--icon)
给你的可执行文件添加一个自定义图标(.ico 格式在 Windows 上通用,.icns 在 macOS 上通用,.png 在 Linux 上可能有效)。
# 假设你有一个 icon.png 文件 pyinstaller --onefile --icon=icon.png my_app.py
D. 不显示命令行窗口 (--windowed 或 -w)
如果你的程序是图形界面应用(如使用 Tkinter, PyQt, Kivy),你可能希望运行时不显示黑色的命令行窗口。
pyinstaller --onefile --windowed my_app.py
- 注意: 如果你的控制台程序也使用了这个选项,你将看不到
print()的输出,这对于调试非常不便。对于控制台脚本,通常不推荐使用此选项。
运行和分发
-
测试: 在你的 Linux 机器上,直接进入
dist目录运行生成的文件。cd dist ./my_app
你应该能看到脚本预期的输出。
-
分发:
- 单文件模式: 你只需要将
dist/my_app这个文件复制给用户,用户需要给它执行权限:chmod +x my_app ./my_app
- 单目录模式: 你需要将整个
dist/my_app文件夹复制给用户,用户进入文件夹后执行:cd my_app ./my_app
- 单文件模式: 你只需要将
高级选项和数据文件
如果你的脚本需要读取外部的数据文件(如图片、配置文件、数据库等),PyInstaller 可能找不到它们,你需要显式地告诉它。
my_app_with_data.py
import os
def main():
# 假设脚本和 data.txt 在同一目录
data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data.txt')
try:
with open(data_path, 'r') as f:
content = f.read()
print(f"文件内容: {content}")
except FileNotFoundError:
print("错误: 找不到 data.txt 文件!")
if __name__ == "__main__":
main()
data.txt
这是一个数据文件。
使用 --add-data 选项来添加数据文件,格式为 源路径:目标路径,在 Linux/macOS 上,路径分隔符是 ,在 Windows 上是 。
# 格式: pyinstaller --add-data "源路径:目标路径" ... pyinstaller --onefile --add-data "data.txt:." my_app_with_data.py
data.txt: 是你当前目录下的源文件。- 是分隔符。
- 表示将文件添加到可执行文件的根目录(工作目录)。
打包后,PyInstaller 会将 data.txt 放在 dist/my_app 目录下(单文件模式)或 dist/my_app/_internal 目录下(单目录模式),程序就能正确找到它了。
使用 cx_Freeze
cx_Freeze 是另一个优秀的打包工具,使用方式与 PyInstaller 类似。
安装
pip install cx-freeze
创建一个 setup.py 脚件
与 PyInstaller 不同,cx_Freeze 通常通过一个 setup.py 脚本来配置。
setup.py
from cx_Freeze import setup, Executable
# 可执行程序的配置
base = None # 对于控制台程序,设为 None,对于GUI程序,可以设为 "Win32GUI" (Windows) 或 "Gui" (Linux/macOS)
executables = [Executable("my_app.py", base=base)]
# 设置
setup(
name="My Awesome App",
version="0.1",
description="My first frozen executable",
executables=executables
)
运行打包
python setup.py build
- 输出文件: 打包后的文件会放在
build目录下,结构类似于dist目录。
使用 py2exe
注意: py2exe 主要用于 Windows 平台,虽然名字里有 exe,但它也支持 Linux,但不如 PyInstaller 和 cx_Freeze 流行,如果你需要为 Windows 打包,py2exe 是一个经典选择。
总结与对比
| 特性 | PyInstaller | cx_Freeze | py2exe |
|---|---|---|---|
| 主要平台 | Windows, macOS, Linux | Windows, macOS, Linux | Windows |
| 使用方式 | 命令行 (pyinstaller ...) |
通过 setup.py 脚本 |
通过 setup.py 脚本 |
| 单文件模式 | --onefile,支持良好 |
需要配置,支持良好 | 不常用,通常生成目录 |
| 依赖分析 | 自动,非常强大 | 自动,强大 | 自动,强大 |
| 社区支持 | 非常活跃,文档丰富 | 活跃,文档良好 | 经典工具,但社区相对较小 |
| 推荐度 | ★★★★★ (首选) | ★★★★☆ | ★★★☆☆ (仅限 Windows) |
最终建议
对于绝大多数在 Linux 上打包 Python 可执行文件的需求,PyInstaller 是你的最佳选择,它简单易用,功能强大,社区活跃,几乎能满足所有场景。
打包流程回顾:
- 编写你的 Python 脚本。
- 使用
pip install pyinstaller安装。 - 在终端运行
pyinstaller --onefile your_script.py。 - 测试
dist/目录下的可执行文件。 - 将可执行文件分发给用户。
