使用PyInstaller将Python脚本打包成exe的新手入门指南

 更新时间:2026年03月29日 09:53:30   作者:kady666  
用 PyInstaller 打包成单个 exe 文件,双击就能运行,省心又专业,本文从零开始手把手教你用 PyInstaller 打包 Python 程序,解决新手常遇到的坑,希望对大家有所帮助

辛辛苦苦写好的 Python 脚本,发给同事却要让他装环境?用 PyInstaller 打包成单个 exe 文件,双击就能运行,省心又专业。本文从零开始,手把手教你用 PyInstaller 打包 Python 程序,解决新手常遇到的坑。

一、为什么需要 PyInstaller?

写了个自动化脚本,发给同事,他说“Python 是啥?怎么运行?” 如果你不想让每个人都安装 Python 和依赖包,PyInstaller 就是救星。

PyInstaller 的作用:把 Python 脚本及其依赖打包成一个独立的可执行文件(Windows 下是 .exe),用户无需 Python 环境,双击即可运行。

支持平台:Windows、macOS、Linux。

二、安装 PyInstaller

最简单的方式是用 pip 安装:pip install pyinstaller

如果下载慢,可以换国内源:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller

安装完成后,在命令行输入以下命令确认是否成功:pyinstaller --version

正常会显示版本号,如 6.7.0

三、快速上手:打包一个最简单的脚本

假设我们有一个名为 hello.py 的脚本,内容如下:

print("Hello, PyInstaller!")
input("按回车键退出...")

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

pyinstaller hello.py

命令执行后,会生成两个目录:

  • build:临时文件目录(可忽略)
  • dist:打包好的可执行文件就在这里

在 dist/hello 目录下(Windows 为 dist/hello)找到 hello.exe(或 hello),双击运行,就能看到输出结果。

注意:默认生成的是一个文件夹,里面包含 exe 和一堆依赖文件。如果想生成单个 exe 文件,加上 -F 参数:

pyinstaller -F hello.py

此时 dist 目录下只有一个 hello.exe,双击就能运行。

四、常用参数详解

-F, --onefile:打包成单个 exe 文件

-D, --onedir:打包成一个文件夹(默认)

-w, --windowed:不显示控制台窗口(适用于 GUI 程序)

-i, --icon:指定 exe 的图标(如 -i icon.ico

--name:指定生成的 exe 文件名

--add-data:添加额外数据文件(如图片、配置文件)

--hidden-import:手动导入 PyInstaller 未能自动发现的模块

五、实战:打包带依赖和 GUI 的程序

假设我们有一个简单的 GUI 程序 gui_app.py,用 tkinter 做了一个小窗口,还依赖一个外部的 config.json 文件。

import tkinter as tk
import json

with open("config.json", "r", encoding="utf-8") as f:
    config = json.load(f)

root = tk.Tk()
root.title(config.get("title", "My App"))
label = tk.Label(root, text=config.get("text", "Hello"))
label.pack()
root.mainloop()

config.json内容:

{
    "title": "我的应用",
    "text": "欢迎使用 PyInstaller"
}

1. 打包单个 exe,不显示控制台窗口

pyinstaller -F -w --add-data "config.json;." gui_app.py

解释

  • -F:单文件
  • -w:无控制台窗口
  • --add-data "config.json;.":将 config.json 文件添加到打包中,并放在 exe 同目录(; 是 Windows 下的分隔符,Linux/macOS 用 :

2. 解决路径问题

程序里如果使用相对路径读取配置文件,打包后可能会找不到。推荐在代码中自动获取正确的路径:

import sys
import os

def resource_path(relative_path):
    """获取资源的绝对路径,适配 PyInstaller 打包"""
    try:
        base_path = sys._MEIPASS  # PyInstaller 临时解压目录
    except AttributeError:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

# 使用
config_path = resource_path("config.json")
with open(config_path, "r") as f:
    config = json.load(f)

然后在打包时,添加 --add-data 并告知 PyInstaller 将文件放到 _MEIPASS 目录下。

pyinstaller -F -w --add-data "config.json;." gui_app.py

这样即使打包成单个 exe,程序也能正确读取到配置文件。

六、常见问题与解决方案

1. 打包后运行报错:ModuleNotFoundError: No module named 'xxx'

原因:PyInstaller 没有自动识别到某些依赖模块。

解决:使用 --hidden-import 手动指定。

pyinstaller -F --hidden-import=pandas --hidden-import=openpyxl my_script.py

2. 打包文件太大,怎么办?

使用 --exclude-module 排除不需要的模块(如 matplotlibnumpy 很占体积)。

如果用了虚拟环境,在干净的环境中打包,避免打包多余包。

3. 图标不生效

确保图标是 .ico 格式(Windows 下),其他格式可能不识别。打包时:

pyinstaller -F -i myicon.ico my_script.py

4. 打包后双击闪退

闪退通常是因为程序报错后立即退出。可以在代码开头加 try...except 捕获错误并暂停:

try:
    # 你的代码
except Exception as e:
    print("Error:", e)
    input("按回车键退出...")

这样就能看到错误信息,方便排查。

七、进阶:使用 spec 文件自定义打包

当参数很多时,可以生成 .spec 配置文件,然后通过 pyinstaller xxx.spec 打包,方便修改和复用。

生成 spec 文件:

pyinstaller hello.py # 会生成 hello.spec

编辑 hello.spec,修改 a.datas 添加数据文件,修改 exe 设置图标等。然后执行:

pyinstaller hello.spec

八、总结

需求命令
基础打包pyinstaller script.py
打包成单个 exepyinstaller -F script.py
无控制台窗口pyinstaller -F -w script.py
指定图标pyinstaller -F -i icon.ico script.py
添加额外文件--add-data "file;."
隐藏导入--hidden-import=module

最佳实践

  • 在虚拟环境中打包,减少体积。
  • 使用 -F 生成单文件,便于分发。
  • 使用 resource_path 函数处理文件路径。
  • 遇到闪退时,先用控制台版本(不加 -w)调试。
  • 对于大型项目,用 spec 文件管理配置。

现在,你可以把自己的 Python 脚本打包成 exe 发给任何人,再也不用担心环境问题了。快去试试吧!

到此这篇关于使用PyInstaller将Python脚本打包成exe的新手入门指南的文章就介绍到这了,更多相关PyInstaller打包Python脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python .py生成.pyd文件并打包.exe 的注意事项说明

    Python .py生成.pyd文件并打包.exe 的注意事项说明

    这篇文章主要介绍了Python .py生成.pyd文件并打包.exe 的注意事项说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python求绝对值的三种方法小结

    python求绝对值的三种方法小结

    今天小编就为大家分享一篇python求绝对值的三种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Django使用channels + websocket打造在线聊天室

    Django使用channels + websocket打造在线聊天室

    本文将教你如何使用channels + websocket打造个在线聊天室。一共只有四步,你可以轻松上手并学会。项目中大部分代码是基于channels的官方文档的,加入了些自己的理解,以便新手学习使用。
    2021-05-05
  • python 求两个向量的顺时针夹角操作

    python 求两个向量的顺时针夹角操作

    这篇文章主要介绍了python 求两个向量的顺时针夹角操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python标准库之数据库 sqlite3

    Python标准库之数据库 sqlite3

    这篇文章主要介绍了Python标准库的数据库 sqlite3的相关资料,SQLite是一个轻量级、跨平台的关系型数据库。它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。下面文字将对其简单介绍,需要的小伙伴可以参考下面文章内容
    2021-09-09
  • Python实现针对json中某个关键字段进行排序操作示例

    Python实现针对json中某个关键字段进行排序操作示例

    这篇文章主要介绍了Python实现针对json中某个关键字段进行排序操作,涉及Python json数组排序及lambda表达式相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • Python 常用模块threading和Thread模块之线程池

    Python 常用模块threading和Thread模块之线程池

    这篇文章主要介绍了Python threading和Thread模块之线程池,线程池如消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务,具体介绍需要的小伙伴可以参考下面文章详细内容
    2022-06-06
  • Django中的CACHE_BACKEND参数和站点级Cache设置

    Django中的CACHE_BACKEND参数和站点级Cache设置

    这篇文章主要介绍了Django中的CACHE_BACKEND参数和站点级Cache设置,Python是最具人气的Python web框架,需要的朋友可以参考下
    2015-07-07
  • django认证系统实现自定义权限管理的方法

    django认证系统实现自定义权限管理的方法

    这篇文章主要介绍了django认证系统实现自定义权限管理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python爬取之json、pickle与shelve库的深入讲解

    python爬取之json、pickle与shelve库的深入讲解

    这篇文章主要给大家介绍了关于python爬取之json、pickle与shelve库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论