python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python代码打包为exe

Python代码打包为exe的六种主流方法及避坑指南

作者:遗憾是什么.

在 Python 开发中,我们常遇到这样的需求:将写好的脚本分享给他人,但对方没有安装 Python 环境,也不懂如何配置依赖,此时,将 Python 代码打包成exe就成了最佳解决方案,本文将详细讲解 6 种主流的 Python 打包工具,需要的朋友可以参考下

前言

在 Python 开发中,我们常遇到这样的需求:将写好的脚本分享给他人,但对方没有安装 Python 环境,也不懂如何配置依赖。此时,将 Python 代码打包成 Windows 可执行文件(.exe)就成了最佳解决方案。本文将详细讲解 6 种主流的 Python 打包工具,从基础操作到进阶配置,帮你彻底搞定 exe 打包问题。

一、打包核心原理:为什么 Python 脚本能变成 exe?

在开始学习具体工具前,我们先搞懂一个关键问题:纯文本的 Python 脚本,是如何变成可执行的 exe 文件的?

本质上,Python 打包工具的核心逻辑分为两步:

  1. 依赖收集:扫描脚本中用到的所有模块(包括 Python 标准库、第三方库如 numpy/pandas),将这些依赖文件与脚本一起打包;
  2. 环境封装:在打包文件中嵌入一个 “迷你 Python 解释器”,当用户运行 exe 时,这个内置解释器会自动加载脚本和依赖,无需系统安装 Python。

不同工具的差异主要体现在:打包体积、启动速度、跨平台支持、配置灵活性等方面。下面我们按 “新手友好度” 排序,逐一讲解各工具的使用方法。

二、新手首选:PyInstaller(最主流、支持最全)

PyInstaller 是目前使用最广泛的 Python 打包工具,支持 Python 3.7-3.12,能打包控制台程序、GUI 程序(如 Tkinter、PyQt),甚至包含数据文件的复杂项目。

1. 基础使用步骤

步骤 1:安装 PyInstaller

打开命令提示符(CMD)或终端,输入以下命令:

# 基础安装(推荐使用国内源加速)

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

步骤 2:简单打包(控制台程序)

假设我们有一个简单的 Python 脚本hello.py:

# hello.py

print("Hello, Python打包世界!")

input("按回车键退出...") # 防止exe运行后直接闪退

在脚本所在文件夹打开 CMD,输入打包命令:

# 基本语法:pyinstaller [选项] 脚本文件名

pyinstaller hello.py

执行完成后,文件夹会生成 3 个目录:

步骤 3:打包 GUI 程序(以 Tkinter 为例)

如果脚本是 GUI 程序,需要添加-w选项(取消控制台窗口),避免运行时弹出黑色命令框。

示例gui_app.py:

import tkinter as tk

from tkinter import messagebox

root = tk.Tk()

root.title("Python GUI打包测试")

root.geometry("300x200")

def show_msg():

messagebox.showinfo("提示", "GUI程序打包成功!")

btn = tk.Button(root, text="点击测试", command=show_msg)

btn.pack(pady=50)

root.mainloop()

打包命令:

pyinstaller -w gui_app.py

2. 进阶配置:自定义图标、打包数据文件

(1)添加自定义图标

需要准备一个.ico格式的图标文件(可通过在线工具将图片转为 ico),使用-i选项指定图标:

# 语法:pyinstaller -i 图标路径 脚本名

pyinstaller -i my_icon.ico -w gui_app.py

(2)打包数据文件(如图片、配置文件)

如果脚本依赖外部文件(如data.txt、image.png),直接打包会导致 exe 找不到文件。此时需要通过--add-data选项指定文件路径:

# Windows系统语法:--add-data "源文件路径;目标路径"(分号分隔)

# 示例:将当前目录的data.txt打包到exe同级的data文件夹

pyinstaller -w --add-data "data.txt;data/" --add-data "images/*;images/" gui_app.py

(3)打包为单文件(方便传输)

默认打包会生成多个依赖文件,使用-F(或--onefile)选项可将所有内容压缩为单个 exe 文件:

# 单文件+无控制台+自定义图标

pyinstaller -F -w -i my_icon.ico gui_app.py

3. PyInstaller 优缺点

优点缺点
支持所有 Python 主流版本和框架单文件打包后启动速度较慢
配置简单,新手易上手生成的 exe 体积较大(默认包含完整依赖)
支持打包数据文件、自定义图标部分冷门库可能出现兼容性问题

三、轻量级选择:cx_Freeze(跨平台、体积小)

cx_Freeze 是另一个成熟的打包工具,最大特点是跨平台(支持 Windows、Mac、Linux),且生成的 exe 体积比 PyInstaller 略小,适合对文件大小敏感的场景。

1. 基础使用步骤

步骤 1:安装 cx_Freeze

pip install cx_Freeze -i https://pypi.tuna.tsinghua.edu.cn/simple

步骤 2:快速打包(自动生成配置)

对于简单脚本hello.py,直接执行以下命令:

# 基本语法:cxfreeze 脚本名 --target-dir 输出目录

cxfreeze hello.py --target-dir dist

执行后,dist/目录会生成hello.exe和相关依赖文件(无临时文件,比 PyInstaller 更简洁)。

步骤 3:打包 GUI 程序(取消控制台)

需要通过--base-name指定 GUI 基础库,Windows 下使用Win32GUI:

# 打包Tkinter GUI程序(无控制台)

cxfreeze gui_app.py --target-dir dist --base-name Win32GUI

2. 进阶配置:通过setup.py自定义

对于复杂项目,建议编写setup.py配置文件,方便重复打包。示例:

# setup.py

import sys

from cx_Freeze import setup, Executable

# 要打包的脚本

script_name = "gui_app.py"

# 配置exe属性

base = None

if sys.platform == "win32":

base = "Win32GUI" # Windows下GUI程序取消控制台

executables = [Executable(

script=script_name,

base=base,

icon="my_icon.ico", # 自定义图标

target_name="my_gui_app.exe" # 输出exe文件名

)]

# 打包配置

setup(

name="Python GUI App",

version="1.0",

description="cx_Freeze打包的Python GUI程序",

executables=executables,

# 打包数据文件(源路径:目标路径)

options={

"build_exe": {

"include_files": [

("data.txt", "data/"),

("images/", "images/")

],

"packages": ["tkinter"] # 显式指定需要包含的库

}

}

)

执行打包命令:

python setup.py build

生成的 exe 文件会放在build/exe.win-amd64-3.x/目录下(根据 Python 版本和系统架构变化)。

3. cx_Freeze 优缺点

优点缺点
跨平台支持好,Windows/Mac/Linux 通用配置文件编写比 PyInstaller 略复杂
生成的 exe 体积较小,启动速度快对部分第三方库(如 PyQt6)兼容性不如 PyInstaller
无临时文件,打包目录更简洁文档不如 PyInstaller 丰富

四、GUI 打包专用:PyQtDeploy(PyQt 程序首选)

如果你开发的是 PyQt/PySide GUI 程序,PyQtDeploy是专门为此设计的打包工具,能优化 Qt 库的打包,减少文件体积,还支持交叉编译(如在 Windows 上打包 Mac 版本)。

1. 安装步骤

PyQtDeploy 依赖 PyQt5/PyQt6 和 Qt 工具链,安装前需先确保已安装 PyQt:

# 安装PyQt6(根据你的项目版本选择PyQt5/PyQt6)

pip install pyqt6 pyqt6-tools

# 安装PyQtDeploy

pip install pyqtdeploy

2. 基础使用步骤

步骤 1:创建项目配置文件

打开命令提示符,进入脚本所在目录,执行:

pyqtdeploy

会弹出图形化配置界面,按以下步骤操作:

  1. 点击 “New” 创建新项目,选择保存路径(如my_project.pdy);
  2. 在 “Sources” 标签页,点击 “Add” 添加要打包的 Python 脚本(如gui_app.py);
  3. 在 “Packages” 标签页,勾选项目依赖的库(如PyQt6、tkinter,工具会自动检测,可手动补充);
  4. 在 “Targets” 标签页,选择目标平台(如Windows),设置输出目录和 exe 文件名;
  5. 在 “Icons” 标签页,添加自定义图标(支持.ico 格式)。

步骤 2:生成打包文件

配置完成后,点击 “Generate” 生成 Makefile 或 Visual Studio 项目文件,然后点击 “Build” 开始打包。

最终生成的 exe 文件会包含优化后的 Qt 库,体积比 PyInstaller 打包的 PyQt 程序小 30% 左右,且运行更稳定。

3. PyQtDeploy 优缺点

优点缺点
专门优化 PyQt/PySide 程序,兼容性最佳仅支持 PyQt/PySide 项目,通用性差
生成的 exe 体积小,Qt 库打包更高效安装依赖多,配置步骤较复杂
支持交叉编译,跨平台打包方便对非 Qt 项目无用

五、其他实用工具:3 种特殊场景选择

除了上述 3 种主流工具,还有 3 个工具适合特定场景,我们简单介绍它们的使用场景和核心特点:

1. nuitka:将 Python 编译为 C 代码(速度最快)

nuitka 的原理与其他工具不同:它会先将 Python 代码编译为 C 代码,再编译为 exe 文件,因此运行速度极快,且反编译难度高(适合商业软件)。

基础使用:

# 安装

pip install nuitka

# 打包控制台程序

nuitka --standalone hello.py

# 打包GUI程序(取消控制台)

nuitka --standalone --windows-disable-console gui_app.py

# 打包单文件+自定义图标

nuitka --standalone --windows-disable-console --windows-icon-from-ico=my_icon.ico --onefile gui_app.py

优缺点:

优点缺点
运行速度比其他工具快 50% 以上打包时间长(需编译 C 代码)
反编译难度高,安全性好生成的 exe 体积较大(包含 C 编译依赖)
支持所有 Python 语法和库对部分动态导入的代码兼容性差

2. auto-py-to-exe:PyInstaller 可视化界面(新手零命令)

如果你讨厌记命令行参数,auto-py-to-exe 是 PyInstaller 的图形化封装工具,通过界面点击即可完成配置,适合纯新手。

基础使用:

# 安装

pip install auto-py-to-exe

# 启动图形界面

auto-py-to-exe

启动后,按界面提示操作:

  1. 点击 “Browse” 选择要打包的 Python 脚本;
  2. 在 “Onefile” 选项选择 “One File”(单文件)或 “One Directory”(多文件);
  3. 在 “Console Window” 选项选择 “Window Based”(GUI 程序)或 “Console Based”(控制台程序);
  4. 点击 “Additional Files” 添加数据文件,“Icon” 选择图标;
  5. 点击 “Convert .py to .exe” 开始打包。

优缺点:

优点缺点
纯图形化操作,零命令行,新手友好本质是 PyInstaller 的封装,功能完全依赖 PyInstaller
配置项直观,无需记参数复杂配置(如交叉编译)支持不足
自动生成打包日志,方便排查错误启动速度较慢,占用内存较高

3. briefcase:模拟原生应用(适合桌面应用分发)

briefcase 的特点是将 Python 程序打包为原生系统格式(Windows 下为 exe,Mac 下为.dmg,Linux 下为.deb),支持自动生成安装向导,适合需要正式分发的桌面应用。

基础使用:

# 安装

pip install briefcase

# 初始化项目(生成配置文件)

briefcase new

# 按提示输入项目名、作者、描述等信息,选择GUI框架(如Tkinter)

# 打包为Windows exe

briefcase build windows

# 生成Windows安装程序(.msi)

briefcase package windows
优点缺点
生成原生系统格式,支持安装向导打包步骤多,配置复杂
适合跨平台桌面应用正式分发生成的文件体积大,启动速度慢
支持自动更新功能对小众库兼容性差

六、打包避坑指南:90% 新手会遇到的问题

1. 问题 1:exe 运行闪退

2. 问题 2:exe 找不到数据文件

import os

import sys

# 获取exe所在目录(兼容打包前后)

def get_resource_path(relative_path):

if hasattr(sys, '_MEIPASS'):

# 打包后,资源文件在sys._MEIPASS目录下

return os.path.join(sys._MEIPASS, relative_path)

# 未打包时,使用当前目录

return os.path.join(os.path.abspath("."), relative_path)

# 读取数据文件

with open(get_resource_path("data/data.txt"), "r") as f:

content = f.read()

3. 问题 3:打包后缺少第三方库(如 numpy、pandas)

4. 问题 4:exe 体积过大

七、工具选择建议:根据场景匹配最佳方案

场景推荐工具理由
新手入门、简单脚本auto-py-to-exe图形化操作,零命令,无学习成本
控制台 / GUI 程序、兼容性优先PyInstaller支持所有 Python 库,文档丰富,社区问题多
跨平台需求、体积敏感cx_Freeze跨平台支持好,体积小,启动速度快
PyQt/PySide GUI 程序PyQtDeploy专门优化 Qt 库,体积小,运行稳定
商业软件、速度优先nuitka编译为 C 代码,运行快,反编译难
正式桌面应用分发briefcase生成原生安装包,支持自动更新

八、总结

Python 打包 exe 的工具各有优劣,没有 “最好”,

以上就是Python代码打包为exe的六种种主流方法及避坑指南的详细内容,更多关于Python代码打包为exe的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文