PyInstaller 是一个非常流行的 Python 打包工具,它可以将 Python 脚本及其依赖项打包成一个独立的可执行文件(如 Windows 下的 .exe),使得在没有安装 Python 环境的机器上也能运行程序。
在开始之前,建议创建一个干净的虚拟环境,以避免打包不必要的库,从而减小文件体积。
在终端(CMD 或 PowerShell)中执行以下命令:
pip install pyinstaller
若需升级到最新版本:
pip install --upgrade pyinstaller
假设您的入口脚本名为 main.py。
pyinstaller main.py
执行后,会生成两个文件夹(build 和 dist)和一个文件(main.spec)。
dist/main/main.exe 即可启动程序。
如果您希望只有一个独立的 .exe 文件,使用 -F 参数:
pyinstaller -F main.py
dist/main.exe。下表列出了最常用的命令行参数:
| 参数 | 简写 | 说明 |
|---|---|---|
–onefile | -F | 将所有内容打包成一个单独的可执行文件。 |
–noconsole | -w | 隐藏控制台窗口。适用于 GUI 程序(如 PyQt, Tkinter)。如果程序出错,将看不到报错信息,建议调试阶段不要加此参数。 |
–icon=FILE | -i | 指定可执行文件的图标(Windows 下需为 .ico 格式)。 |
–name=NAME | -n | 指定生成的可执行文件的名称。 |
–clean | 在构建之前清理 PyInstaller 缓存并删除临时文件。 | |
–add-data | 添加非代码资源文件(如图片、配置文件)。格式为 源路径;目标路径 (Windows) 或 源路径:目标路径 (Linux/Mac)。 |
示例:打包一个带图标的 GUI 程序
pyinstaller -F -w -i "logo.ico" -n "我的爬虫工具" main.py
如果您的代码中读取了外部文件(如 config.yaml 或图片),打包后可能会报错“找不到文件”。这是因为打包后的运行路径发生了变化。
在 Python 代码中,需要使用以下函数来获取资源的绝对路径:
import sys import os def resource_path(relative_path): """ 获取资源绝对路径,适用于开发环境和 PyInstaller 打包后的环境 """ if hasattr(sys, '_MEIPASS'): # PyInstaller 打包后,文件会被解压到 sys._MEIPASS 临时目录 return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) # 使用示例 config_path = resource_path("config.yaml")
使用 –add-data 将文件包含进去。注意 Windows 使用分号 ; 分隔。
# 格式: --add-data "源文件;打包后的内部路径" pyinstaller -F --add-data "config.yaml;." main.py
第一次运行 PyInstaller 命令后,会自动生成一个 name.spec 文件。您可以直接编辑这个文件来管理复杂的打包配置,而不需要每次都敲很长的命令。
编辑 main.spec 文件中的 Analysis 部分:
a = Analysis( ['main.py'], pathex=[], binaries=[], datas=[('config.yaml', '.'), ('images/', 'images/')], # 在这里添加资源文件 hiddenimports=['pandas'], # 在这里手动添加未被识别的库 ... )
使用 Spec 文件打包:
pyinstaller main.spec
现象:报错 UnicodeDecodeError 或构建中断。
解决:
E:\工作\2025\项目\…\)。C:\Build\Project 目录下进行打包。现象:打包成功,但运行时提示找不到某个库(常见于 pandas, numpy 或动态导入的库)。 解决:
–hidden-import 参数手动指定:pyinstaller -F --hidden-import=pandas._libs.tslibs.base main.py
hiddenimports 列表中添加。现象:一个简单的脚本打包后有几百 MB。 解决:
pipenv 或 venv 创建纯净环境,只安装必要的库。–exclude-module matplotlib。现象:打包出的 exe 被 Windows Defender 或 360 删除。 解决:
pyinstaller -F main.py。-w 去除黑框。.spec 文件。