Python项目打包成EXE完整教程(PyInstaller实战避坑)

前言

很多小伙伴写完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个文件夹:

  1. build:打包临时缓存文件,可以直接删除
  2. dist最终EXE程序存放目录
  3. 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

✅解决方案:

  1. 目标系统同版本Windows下打包;
  2. 不要使用精简版、绿色版Python;
  3. 部分库(opencv、torch)自带大量dll,体积会显著增大,属于正常现象。

3. 使用-w隐藏控制台后程序闪退,看不到报错

排查方案:暂时去掉 -w 参数重新打包,运行exe查看控制台报错信息,定位bug。

4. 杀毒软件误报病毒

原理:PyInstaller打包方式容易被360、Windows Defender特征拦截。

✅解决办法:

  1. 正规发布软件可以进行数字签名;
  2. 开发测试阶段将dist目录加入杀毒白名单;
  3. 告知使用者放行。

5. 打包PyQt、tkinter程序出现模块缺失

部分库不会被自动依赖扫描,需要手动通过 --hidden-import 导入

bash 复制代码
pyinstaller -F main.py --hidden-import=PyQt5.QtMultimedia

五、进阶优化:UPX压缩(进一步减小exe体积)

UPX是可执行文件压缩工具,可以对生成的EXE进行压缩,体积最高减少30%

  1. 下载UPX,解压,把upx.exe放到python根目录或者添加环境变量
  2. 打包命令增加 --upx-dir 参数
bash 复制代码
pyinstaller -F --upx-dir="D:\tools\upx" main.py

注意:部分杀毒软件对UPX压缩后的程序更加敏感,谨慎使用。

六、补充:其他打包方案对比

  1. PyInstaller:首选,易用稳定,本文方案
  2. cx_Freeze:跨平台,配置相对繁琐
  3. Nuitka:将Python编译为C代码再打包,运行速度更快、逆向难度更高;缺点:编译慢,部分第三方库兼容性差。

如果追求运行性能,可以尝试Nuitka作为进阶方案。

结语

掌握PyInstaller打包之后,你的Python脚本就能脱离Python环境直接分发给普通用户使用。

开发流程建议:

本地代码调试 → 虚拟环境安装依赖 → 测试运行确认无BUG → 使用 -F 参数打包 → 本地测试EXE → 拷贝至其他纯净Windows电脑兼容性测试。

遇到打包报错优先看控制台日志,绝大多数问题都是资源路径缺失、依赖库多余或者模块未隐式导入导致。

相关推荐
bamb001 小时前
一个项目带你入门AI应用开发01
python
0566462 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄2 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰2 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔2 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
Leighteen2 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
0566462 小时前
Python康复训练——控制流与函数
开发语言·python·学习
峥无2 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波3 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl