前言
很多小伙伴写完Python脚本后,只能在自己装有Python环境的电脑上运行,如果发给没有安装Python的同事、客户,直接双击.py文件无法执行。
解决方案就是把Python代码打包成独立 EXE可执行程序,Windows电脑无需提前安装Python环境就能直接运行。
目前主流打包工具:PyInstaller,跨平台、使用简单、社区成熟,本文全部基于Windows环境实操,覆盖基础用法、参数详解、常见报错解决方案。
环境说明:Windows10/11,Python3.7~3.11通用(3.12部分旧库兼容性较差)
一、安装PyInstaller
打开CMD/PowerShell,执行pip安装命令
bash
pip install pyinstaller
如果国内下载缓慢,使用清华镜像源加速
bash
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
校验是否安装成功,输出版本号即代表正常:
bash
pyinstaller -v
⚠️重要提示
建议使用虚拟环境打包!
原生全局Python环境会打包所有已安装第三方库,导致EXE体积巨大。只保留项目真正依赖的包,打包体积能缩减50%以上。
创建虚拟环境简易命令:
bash
# 创建venv环境
python -m venv build_env
# 激活环境(Windows cmd)
build_env\Scripts\activate
# 在虚拟环境内只安装项目所需依赖
pip install requests pillow ...
二、基础打包命令讲解
假设你的主程序文件名为 main.py,进入脚本所在文件夹执行命令。
1.最简打包命令(调试使用)
bash
pyinstaller main.py
执行完成后目录会生成3个文件夹:
build:打包临时缓存文件,可以直接删除dist:最终EXE程序存放目录main.spec:打包配置脚本
缺点:生成大量依赖文件,不是单文件,需要整个dist文件夹一起发送,不方便分发。
2.打包为【单个独立EXE】(推荐生产使用)
核心参数:--onefile(简写 -F)
bash
pyinstaller -F main.py
执行后dist目录下只有一个main.exe,直接复制这一个文件就能在其他电脑运行。
3.隐藏黑色控制台窗口(GUI程序必备)
如果开发tkinter、PyQt、PySide图形界面软件,不希望运行弹出黑框控制台,增加参数 --windowed(简写 -w)
bash
pyinstaller -F -w main.py
❗注意:控制台程序、脚本程序不要加
-w,程序报错时看不到日志,出问题很难排查!
4.自定义EXE程序图标
准备一张 .ico 格式图标文件,使用-i指定图标
bash
pyinstaller -F -w -i logo.ico main.py
5.完整常用组合示例
GUI图形程序,单文件、无黑框、自定义图标
bash
pyinstaller -F -w -i app.ico main.py
命令行脚本程序,单文件,保留控制台(方便看输出日志)
bash
pyinstaller -F main.py
三、打包附带静态资源文件(图片、配置、模型)
很多项目不只有py代码,还需要读取图片、json配置、onnx模型、txt文件。
直接打包会导致程序运行提示【文件找不到】。
方式1:命令行附加资源(Windows语法)
格式:--add-data "源路径;目标路径"
分号 ; 是Windows分隔符,Mac/Linux使用冒号 :
示例:把assets文件夹全部打包,运行时放到程序根目录
bash
pyinstaller -F main.py --add-data "assets;assets"
单个文件示例:
bash
pyinstaller -F main.py --add-data "config.json;."
"." 代表打包后放置到exe同级目录
方式2:spec配置文件(资源多的时候首选)
首次打包后会生成 main.spec,找到 datas=[]
填写资源,示例:
python
datas=[
("assets", "assets"),
("config.json", ".")
]
修改spec文件后,不再直接打包py,执行spec打包:
bash
pyinstaller main.spec
代码内兼容【源码运行 / EXE打包后运行】
打包后资源路径会发生变化,需要写路径兼容代码,通用模板:
python
import sys, os
def get_resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
# 打包成exe后临时解压目录
base_path = sys._MEIPASS
else:
# 本地py源码运行
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
# 使用示例
img_path = get_resource_path("assets/test.png")
四、关键避坑清单(高频问题汇总)
1. EXE文件体积过大
原因:全局环境多余依赖全部打包进去
✅解决方案:使用纯净虚拟环境,只安装项目必要依赖
2. 其他电脑运行报错:缺少xxx.DLL
✅解决方案:
- 在目标系统同版本Windows下打包;
- 不要使用精简版、绿色版Python;
- 部分库(opencv、torch)自带大量dll,体积会显著增大,属于正常现象。
3. 使用-w隐藏控制台后程序闪退,看不到报错
排查方案:暂时去掉 -w 参数重新打包,运行exe查看控制台报错信息,定位bug。
4. 杀毒软件误报病毒
原理:PyInstaller打包方式容易被360、Windows Defender特征拦截。
✅解决办法:
- 正规发布软件可以进行数字签名;
- 开发测试阶段将dist目录加入杀毒白名单;
- 告知使用者放行。
5. 打包PyQt、tkinter程序出现模块缺失
部分库不会被自动依赖扫描,需要手动通过 --hidden-import 导入
bash
pyinstaller -F main.py --hidden-import=PyQt5.QtMultimedia
五、进阶优化:UPX压缩(进一步减小exe体积)
UPX是可执行文件压缩工具,可以对生成的EXE进行压缩,体积最高减少30%
- 下载UPX,解压,把upx.exe放到python根目录或者添加环境变量
- 打包命令增加
--upx-dir参数
bash
pyinstaller -F --upx-dir="D:\tools\upx" main.py
注意:部分杀毒软件对UPX压缩后的程序更加敏感,谨慎使用。
六、补充:其他打包方案对比
- PyInstaller:首选,易用稳定,本文方案
- cx_Freeze:跨平台,配置相对繁琐
- Nuitka:将Python编译为C代码再打包,运行速度更快、逆向难度更高;缺点:编译慢,部分第三方库兼容性差。
如果追求运行性能,可以尝试Nuitka作为进阶方案。
结语
掌握PyInstaller打包之后,你的Python脚本就能脱离Python环境直接分发给普通用户使用。
开发流程建议:
本地代码调试 → 虚拟环境安装依赖 → 测试运行确认无BUG → 使用 -F 参数打包 → 本地测试EXE → 拷贝至其他纯净Windows电脑兼容性测试。
遇到打包报错优先看控制台日志,绝大多数问题都是资源路径缺失、依赖库多余或者模块未隐式导入导致。