杰瑞科技汇

Linux Python可执行文件如何生成?

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

Linux Python可执行文件如何生成?-图1
(图片来源网络,侵删)

核心概念

在开始之前,需要理解几个关键概念:

  1. 解释型语言 vs. 编译型语言:

    • 像 C/C++ 这样的编译型语言,源代码会直接编译成特定平台(如 Linux x86_64)的机器码,生成一个二进制可执行文件(.exe 或无后缀),这个文件不依赖任何解释器,可以直接运行。
    • Python 是解释型语言,Python 脚本(.py 文件)本身不是机器码,而是文本,它需要一个 Python 解释器来读取和执行这些指令。
  2. 打包工具的作用:

    • 打包工具(如 PyInstaller)的工作原理是:将你的 Python 脚本、它所依赖的所有库(第三方库和标准库)以及一个合适的 Python 解释器“捆绑”在一起,打包成一个单独的文件或文件夹。
    • 这样,当用户运行这个打包后的文件时,程序会自动使用内置的解释器来执行你的脚本,无需用户提前安装 Python。

使用 PyInstaller (最推荐)

PyInstaller 是目前最流行、功能最强大的 Python 打包工具之一,它支持 Windows, macOS, 和 Linux,并且能很好地处理各种依赖项。

Linux Python可执行文件如何生成?-图2
(图片来源网络,侵删)

安装 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 命令。

Linux Python可执行文件如何生成?-图3
(图片来源网络,侵删)

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 是你的最佳选择,它简单易用,功能强大,社区活跃,几乎能满足所有场景。

打包流程回顾:

  1. 编写你的 Python 脚本。
  2. 使用 pip install pyinstaller 安装。
  3. 在终端运行 pyinstaller --onefile your_script.py
  4. 测试 dist/ 目录下的可执行文件。
  5. 将可执行文件分发给用户。
分享:
扫描分享到社交APP
上一篇
下一篇