使用PyInstaller将Python代码打包为Exe程序

蓝鲸
蓝鲸
发布时间:2026-10-11| 2人浏览过
原创

本文详细介绍如何使用PyInstaller将Python脚本打包为独立的Windows可执行程序。内容涵盖环境配置、单文件生成命令、隐藏控制台窗口、自定义应用程序图标,以及处理静态资源文件的运行时路径写法,帮助开发者快速分发无需依赖环境的桌面端软件。

基础环境与单文件打包

许多非开发使用者认为只有直接双击运行的 .exe 才算是正式软件,而 .py 脚本缺乏独立性。通过 PyInstaller,可以将包含逻辑的代码编译为独立的运行文件,彻底摆脱对解释器的依赖。

第1步:安装依赖库

打开终端或命令行,执行以下命令安装打包工具、图像处理库及网络请求库:

pip install pyinstaller pillow requests

第2步:准备测试脚本

创建一个名为 hello_world.py 的文件,用于验证打包流程:

print("hello world!!")

# 防止程序执行完毕后立即退出
input()

常规运行方式为 python hello_world.py。

第3步:执行单文件打包

进入脚本所在目录,运行打包指令。该参数会将所有依赖解压至同一个 .exe 文件中:

pyinstaller --onefile hello_world.py

等待命令执行完毕,当前目录下会新增 build、dist 和日志文件。目标程序位于 dist 文件夹中。

dist目录下的生成的可执行文件
打包完成后dist目录内的文件结构

双击 dist/hello_world.exe 即可独立运行,无需安装Python环境。

进阶配置:隐藏控制台与自定义图标

隐藏后台控制台窗口

对于纯图形界面(GUI)或后台服务脚本,可通过 --noconsole 参数剥离黑色CMD窗口:

pyinstaller --onefile --noconsole main.py

注意:启用此参数后,程序中不得包含 input() 或标准输出阻塞调用,否则会导致进程假死。以下是结合 tkinter 抓取本机的示例:

import tkinter as tk
from tkinter import scrolledtext
import requests

def fetch_data():
    try:
        response = requests.get("http://httpbin.org/get")
        response.raise_for_status()
        data = response.json()
        info = f'您的当前的ip地址是:{data.get("origin")}'
        
        text_area.delete("1.0", tk.END)
        text_area.insert(tk.END, info) 
    except requests.RequestException as e:
        text_area.delete("1.0", tk.END)
        text_area.insert(tk.END, f"请求失败: {e}")

window = tk.Tk()
window.title("查看本地ip")
text_area = scrolledtext.ScrolledText(window, width=60, height=20)
text_area.pack(padx=10, pady=10)
fetch_button = tk.Button(window, text="获取数据", command=fetch_data)
fetch_button.pack(pady=5)
window.mainloop()
GUI程序运行界面
使用--noconsole参数生成的GUI程序运行效果

替换默认应用程序图标

未指定图标时,打包出的 .exe 会使用默认的空白纸张标识。添加自定义图标需使用 --icon 参数:

pyinstaller --onefile --icon=my_icon.ico main.py

.exe 仅接受 .ico 格式。若仅有PNG/JPG图片,可使用Pillow转换:

from PIL import Image

img = Image.open("我的图片.png")
img = img.resize((256, 256))
img.save("my_icon.ico", format="ICO")
默认打包图标样式
未指定icon时的系统默认显示样式

Windows系统可能存在图标缓存未及时刷新的问题。若打包后仍显示旧图标,可在管理员终端执行以下命令强制刷新:

ie4uinit.exe -show
自定义图标后的运行效果示例
成功注入自定义图标后的可执行程序外观

资源文件管理与模块导入

真实项目中常需加载外部配置文件或模板。直接写入相对路径在打包后会因工作目录变更而失效,需采用特殊处理。

方式一:手动放置资源(推荐简单项目)

例如读取 book.json,可将该文件复制到最终生成的 .exe 同级目录,原有 open("book.json") 写法即可正常运行。

方式二:嵌入包体内并动态解析路径

使用 --add-data 将资源压缩进 .exe。语法区分操作系统:

  • Windows:--add-data "源路径;目标路径"
  • Linux/macOS:--add-data "源路径:目标路径"

打包命令示例:

pyinstaller --onefile --add-data "book.json;." main.py

由于嵌入文件实际运行时会解压至临时目录,必须修改读写逻辑以适配环境变量 sys._MEIPASS:

import json
import sys
import os

def resource_path(relative_path):
    # 判断是否在PyInstaller临时环境中运行
    if hasattr(sys, "_MEIPASS"):
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

# 安全调用
json_path = resource_path("book.json")
with open(json_path, "r", encoding="utf-8") as f:
    books = json.load(f)
    print(books)

风险提醒:sys._MEIPASS 指向的临时目录具有只读属性,严禁在此路径执行写入或修改操作。如需持久化保存用户数据,应转向 AppData、~/.local 或桌面目录。

第三方模块动态导入处理

PyInstaller 能够自动分析标准的 import 引用。但对于基于字符串反射或插件机制的动态导入(如 importlib.import_module(name)),需在打包时显式声明:

pyinstaller --onefile --hidden-import=settings main.py

性能评估与适用边界

在使用前应明确该方案的利弊,以便匹配合理预期:

  • 优势:彻底解耦运行环境,小白用户可直接双击使用;对底层逻辑有一定物理遮蔽作用,降低源码直接暴露风险。
  • 劣势:打包体积显著膨胀(基础环境约需几十MB至上百MB);--onefile 模式启动时需先完成内存解压,冷启动速度比原生 .py 慢1~3秒。

综上,该方案最适合面向非技术人员分发轻量级工具、自动化批处理脚本或小型GUI客户端。若追求极致启动速度或极低占用率,则应考虑Nuitka或保持服务端架构。

以上就是使用PyInstaller将Python代码打包为Exe程序的详细内容,更多关于Python桌面应用开发与分发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。