下面我将为你提供一份详尽的、从零开始的 PyInstaller 使用指南,包括基础用法、高级配置和常见问题解决。

核心工具:PyInstaller
PyInstaller 可以分析你的 Python 脚本,自动找到所有依赖的库(如 numpy, pandas, Pillow 等),并将它们和你的脚本一起打包成一个或多个独立的 .exe 文件。
第一步:安装 PyInstaller
你需要安装 PyInstaller,打开你的终端或命令行工具(如 Windows 的 CMD 或 PowerShell,macOS/Linux 的 Terminal),运行以下命令:
pip install pyinstaller
为了确保安装成功,你可以检查版本:
pyinstaller --version
第二步:准备你的 Python 项目
假设你有一个简单的 Python 项目,结构如下:

my_project/
├── main.py # 你的主程序入口
├── utils.py # 一个模块文件
└── assets/ # 存放图片、配置文件等资源的文件夹
└── logo.png
main.py 的内容:
它会导入 utils.py 中的函数,并尝试使用一个外部资源 logo.png。
# main.py
import sys
import os
from utils import greet
def resource_path(relative_path):
""" 获取资源的绝对路径,无论是开发环境还是打包后的环境 """
try:
# PyInstaller 创建一个临时文件夹 _MEIPASS,并将路径存储在 _MEIPASS 中
base_path = sys._MEIPASS
except Exception:
# 如果不在打包环境中,则使用当前脚本所在目录
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
if __name__ == "__main__":
print("--- 我的 Python 应用程序 ---")
# 调用 utils.py 中的函数
message = greet("用户")
print(message)
# 尝试加载一个外部资源
logo_path = resource_path("assets/logo.png")
if os.path.exists(logo_path):
print(f"成功找到资源文件: {logo_path}")
# 这里可以使用 Pillow 等库来加载图片
# from PIL import Image
# img = Image.open(logo_path)
# img.show()
else:
print(f"警告: 未找到资源文件 {logo_path}")
input("按 Enter 键退出...") # 防止控制台窗口一闪而过
utils.py 的内容:
# utils.py
def greet(name):
return f"你好, {name}! 欢迎使用我的程序。"
第三步:使用 PyInstaller 打包
打开你的终端,cd 到 my_project 目录,然后根据你的需求选择以下命令。
最简单的打包(单目录模式)
这个命令会生成一个 dist 文件夹,里面包含一个 main 文件夹,你的 main.exe 和所有依赖都在里面。

pyinstaller main.py
执行后:
build/: 临时文件夹,打包过程中产生的文件,可以删除。dist/: 最终输出文件夹。main.spec: PyInstaller 的配置文件,可以用于自定义打包。
优点:结构清晰,依赖和 .exe 分开放。
缺点:文件夹较多,不方便分发。
最常用的打包(单文件模式)
这个命令会生成一个独立的 main.exe 文件,所有依赖都压缩在这个文件里,这是最常见的需求。
pyinstaller -F main.py
执行后:
dist/main.exe: 这就是你想要的独立可执行文件。
优点:只有一个文件,非常方便分发。 缺点:启动速度比单目录模式慢,因为需要先在临时目录解压所有依赖。
带控制台窗口的打包
默认情况下,-F 打包的程序会弹出一个黑色的控制台窗口,如果你的程序本身就是一个命令行工具,这很合适。
# 默认就是带控制台的,可以不加 -c pyinstaller -F -c main.py
不带控制台窗口的打包(GUI 程序适用)
如果你的程序是图形界面(GUI)应用,你不希望看到一个黑色的控制台窗口闪烁,使用 -w 或 --windowed 参数。
pyinstaller -F -w main.py
⚠️ 重要提示:使用 -w 后,如果程序发生错误导致崩溃,错误信息会一闪而过,你将无法看到,调试时建议先不加 -w 打包,确保程序正常运行。
第四步:处理数据和资源文件(关键步骤)
当你尝试运行上面打包好的 main.exe 时,你会发现它无法找到 assets/logo.png 文件,这是因为 PyInstaller 默认不会自动包含非代码文件(如图片、配置文件等)。
解决方法有两个,推荐使用第一种。
使用 --add-data 参数(推荐)
这个参数用于将数据文件添加到打包中,格式为 源路径:目标路径。
- Windows: 使用 作为分隔符。
- macOS/Linux: 使用 作为分隔符。
# Windows pyinstaller -F -w --add-data "assets;assets" main.py # macOS/Linux # pyinstaller -F -w --add-data "assets:assets" main.py
assets: 是你项目中的源文件夹路径。assets: 是你希望在打包后的exe运行时,文件被解压到的目标路径,这个目标路径需要和你代码中resource_path函数的逻辑对应起来。
resource_path 函数的工作原理:
当程序被 PyInstaller 打包后,它会创建一个临时的 _MEIPASS 文件夹,并将所有依赖(包括通过 --add-data 添加的文件)解压到里面。sys._MEIPASS 就指向这个临时文件夹的路径,我们的 resource_path 函数就是利用这个特性,动态地找到资源的正确位置。
在 .spec 文件中配置
对于更复杂的项目,修改 .spec 文件是更灵活的方式。
- 先运行一次
pyinstaller -F main.py生成main.spec文件。 - 编辑
main.spec文件,在datas列表中添加你的数据文件。
# main.spec
# ... (其他代码)
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[('assets', 'assets')], # <--- 在这里添加
...
)
# ... (其他代码)
- 然后使用这个
.spec文件来打包:
pyinstaller main.spec
第五步:最终运行和分发
- 运行:进入
dist文件夹,双击main.exe运行它,它应该能正确显示问候语,并找到logo.png文件(如果你添加了资源文件)。 - 分发:你只需要将
dist文件夹里的内容(如果是单文件模式,就是那个.exe文件)发送给用户即可,用户无需安装 Python,直接双击运行即可。
常见问题与高级技巧
问题1:打包后的 exe 文件很大,如何减小体积?
- UPX 压缩:PyInstaller 可以使用 UPX 工具来压缩 exe 文件本身,首先需要安装 UPX (Windows 上可能需要手动下载并添加到 PATH),然后使用
--upx-dir参数。pyinstaller -F --upx-dir="C:\path\to\upx" main.py
- 排除不必要的模块:如果你的程序没有用到某些库(如
numpy,scipy),PyInstaller 可能还是会包含它们,你可以使用--exclude-module参数来排除。pyinstaller -F --exclude-module=numpy --exclude-module=scipy main.py
- 使用
--hidden-import:PyInstaller 没有自动检测到某个隐式导入的模块,你需要手动告诉它。pyinstaller -F --hidden-import=some_library_that_is_not_detected main.py
问题2:打包后运行时出现 ModuleNotFoundError
这通常意味着 PyInstaller 没能找到某个动态链接库(.dll, .so 文件),常见于某些 C/C++ 扩展库(如 PyQt5, opencv-python)。
- 解决方案:找到缺失的
.dll文件,然后使用--add-binary参数将其添加到打包中,和 `--add
