#python项目生成exe相关了解
在 Windows 上将 Python 项目 生成 EXE 可执行文件,主要使用 pyinstaller。以下是完整步骤:
📌 1. 安装 PyInstaller
pip install pyinstaller
如果已安装,可执行以下命令检查版本:
pyinstaller --version
📌 2. 进入 Python 项目目录
cd your_project_directory
确保 main.py 是项目的入口文件。
📌 3. 生成 EXE 文件
✅ 单文件模式(适用于小型项目)
pyinstaller --onefile main.py
--onefile:生成 单个 EXE 文件,所有依赖会被打包进这个 EXE。
✅ 目录模式(适用于大型项目,减少 EXE 启动时间)
pyinstaller -D main.py
-D(--onedir):将 EXE 及所有依赖放入dist/目录。
✅ 无控制台模式(GUI 应用)
如果你的程序是 图形界面(如 PyQt、Tkinter),可以隐藏终端窗口:
pyinstaller --onefile --windowed main.py
--windowed(-w):不显示终端黑窗口,仅适用于 GUI 程序。
✅ 指定图标
pyinstaller --onefile --windowed --icon=myicon.ico main.py
--icon=myicon.ico:EXE 使用指定图标。
📌 4. 运行生成的 EXE
生成的文件位于 dist/ 目录:
cd dist
main.exe
可直接拷贝 main.exe 到其他 Windows 电脑运行(无需 Python 环境)。
📌 5. 解决 EXE 运行问题
🔹 避免 EXE 被误报为病毒
- 原因:PyInstaller 使用
UPX压缩,部分杀毒软件误判。 - 解决:
pyinstaller --onefile --noconsole --noupx main.py--noupx:禁用 UPX 压缩。
🔹 修复 EXE 运行时报 Failed to execute script
尝试 清理缓存后重新打包:
pyinstaller --clean --onefile main.py
🔹 依赖模块丢失
如果运行时提示 ModuleNotFoundError,需要手动指定:
pyinstaller --onefile --hidden-import=<module_name> main.py
📌 6. 让 EXE 更便携
如果要 支持拷贝到其他电脑直接运行:
pyinstaller --onefile --add-data "config.json;." --add-data "assets/;assets/" main.py
--add-data:确保额外资源(如配置文件、图片)一并打包。
📌 7. 结论
- 安装 PyInstaller
- 进入 Python 项目目录
- 执行
pyinstaller生成 EXE - 拷贝
dist/main.exe到其他电脑直接运行 🚀
🎯 适用于 Tkinter、PyQt、PySide、pygame 等 GUI 应用,打包后可脱离 Python 运行!
在 pyinstaller 命令中,--add-data 选项用于将额外的文件或目录打包到 EXE 文件中。
📌 解释 "config.json;." 的含义
--add-data "config.json;."
拆解说明:
config.json:指的是当前目录下的config.json文件(打包前的位置)。.(分号;后面的.):表示打包后,这个文件应该放到 EXE 解压后的 工作目录(运行时的sys._MEIPASS目录)。
📌 作用:
👉 让 config.json 在 EXE 运行时仍然可用,就像它原本在当前目录一样。
📌 解释 "assets/;assets/"
--add-data "assets/;assets/"
拆解说明:
assets/:打包前的文件夹路径(当前目录下的assets/文件夹)。assets/(分号;后面的路径):表示打包后,它仍然应该放到assets/这个目录里。
📌 作用:
👉 确保 assets/ 目录及其所有内容都被正确打包,并在运行 EXE 时保持相对路径不变。
📌 为什么用分号 ;?
🔹 在 Windows 下,PyInstaller 需要使用 ; 分隔源路径和目标路径(Linux/macOS 用 :)。
🔹 在 macOS/Linux 上,写法如下:
--add-data "config.json:."
--add-data "assets/:assets/"
📌 代码示例:正确读取 config.json
打包后,EXE 运行时,所有被 --add-data 选项打包的文件会存放在 sys._MEIPASS 目录。
因此,你需要修改代码,动态获取文件路径:
import os
import sys
import json# 获取资源文件的正确路径
def resource_path(relative_path):"""在开发环境返回原路径,在 EXE 运行时返回打包路径"""if getattr(sys, 'frozen', False):# 运行时(EXE模式)base_path = sys._MEIPASSelse:# 开发环境base_path = os.path.abspath(".")return os.path.join(base_path, relative_path)# 读取 config.json
config_path = resource_path("config.json")with open(config_path, "r", encoding="utf-8") as f:config = json.load(f)print("配置内容:", config)
📌 结论
| 选项 | 含义 |
|---|---|
config.json;. | 把 config.json 放在 EXE 运行时的当前目录 |
assets/;assets/ | 把整个 assets/ 目录打包,并保持其路径 |
🛠 这样做的好处:
- 确保 EXE 运行时能找到这些文件。
- 打包后,仍然可以使用
config.json和assets/目录。 - 支持跨平台(Windows 需要
;,Linux/macOS 需要:)。
🚀 这样打包后,EXE 运行时就能正确访问这些资源文件了!
📌 pyinstaller -D main.py 适用于大项目吗?
🔹 结论:可以,但建议做额外优化! 🚀
pyinstaller -D main.py (等价于 --onedir) 会生成一个 dist/ 目录,包含 EXE 及所有依赖文件,适用于大项目,但可能会遇到以下问题:
📌 1. 适用于大项目的正确做法
对于大项目,推荐使用目录模式(-D)+ 额外参数优化:
pyinstaller -D --hidden-import=<module> --add-data "config.json;." --add-data "static/;static/" main.py
✅ 关键优化点
| 选项 | 作用 |
|---|---|
-D / --onedir | 默认模式,在 dist/ 目录生成多个依赖文件,不压缩,启动快 |
--hidden-import=<module> | 如果 PyInstaller 误报缺少依赖,可手动添加 |
--add-data | 打包额外资源(如 config.json、static/ 目录) |
--clean | 清理历史缓存,避免异常 |
--log-level=DEBUG | 调试模式,帮助排查问题 |
📌 2. 可能遇到的问题及解决方案
🔹 1. EXE 运行时报 ModuleNotFoundError
原因:pyinstaller 可能漏掉了一些动态导入的库(如 importlib、cv2、tensorflow)。
解决方案:
pyinstaller -D --hidden-import=<缺失模块> main.py
示例(补充 pandas 相关依赖):
pyinstaller -D --hidden-import=pandas._libs.tslibs main.py
🔹 2. 运行后找不到 config.json、static/ 等资源
原因:PyInstaller 默认不会打包非 Python 代码的文件。
解决方案:手动指定:
pyinstaller -D --add-data "config.json;." --add-data "static/;static/" main.py
📌 特别注意:
- Windows 使用
;分隔源路径和目标路径(config.json;.)。 - Linux/macOS 使用
:(config.json:.)。
🔹 3. dist/ 目录过大,EXE 体积太大
原因:大项目依赖多,打包会包含整个 Python 运行环境。
解决方案:
- 排除不必要的库
pyinstaller -D --exclude-module numpy main.py - 使用
UPX压缩
⚠ 注意:某些杀毒软件会误报 UPX 压缩的 EXE 为病毒,慎用!pyinstaller -D --upx-dir=UPX_PATH main.py
🔹 4. EXE 运行时报 Failed to execute script
解决方案:
pyinstaller -D --clean main.py
📌 如果仍然报错,请检查:
- 是否使用了相对路径(可以用
sys._MEIPASS获取PyInstaller运行时目录)。 - 是否缺少必要的
--hidden-import。
📌 3. 总结
✅ pyinstaller -D main.py 适用于大项目,但建议做以下优化:
- 加
--add-data,确保资源文件被正确打包。 - 加
--hidden-import,避免ModuleNotFoundError。 - 使用
--clean清理,防止历史缓存导致问题。 - 优化 EXE 体积,可用
--exclude-module及UPX压缩。
🎯 最终推荐命令:
pyinstaller -D --hidden-import=<module> --add-data "config.json;." --add-data "static/;static/" --clean main.py
🚀 这样能保证大项目正确打包,且运行时不会报错!
相关文章:
#python项目生成exe相关了解
在 Windows 上将 Python 项目 生成 EXE 可执行文件,主要使用 pyinstaller。以下是完整步骤: 📌 1. 安装 PyInstaller pip install pyinstaller如果已安装,可执行以下命令检查版本: pyinstaller --versionὌ…...
Opencv计算机视觉编程攻略-第九节 描述和匹配兴趣点
一般而言,如果一个物体在一幅图像中被检测到关键点,那么同一个物体在其他图像中也会检测到同一个关键点。图像匹配是关键点的常用功能之一,它的作用包括关联同一场景的两幅图像、检测图像中事物的发生地点等等。 1.局部模板匹配 凭单个像素就…...
JSON-lib考古现场:在2025年打开赛博古董店的奇妙冒险
各位在代码海洋里捡贝壳的探险家们!今天我们要打开一个尘封的Java古董箱——JSON-lib!这货可是2003年的老宝贝,比在座很多程序员的工龄还大!准备好穿越回Web 1.0时代,感受XML统治时期的余晖了吗? …...
Android: Handler 的用法详解
Android 中 Handler 的用法详解 Handler 是 Android 中用于线程间通信的重要机制,主要用于在不同线程之间发送和处理消息。以下是 Handler 的全面用法指南: 一、Handler 的基本原理 Handler 基于消息队列(MessageQueue)和循环器(Looper)工作,…...
汇编学习之《push , pop指令》
学习本章前线了解ESP, EBP 指令 汇编学习之《指针寄存器&大小端学习》-CSDN博客 栈的特点: 好比一个垂直容器,可以陆续放入物体,但是先放的物体通常会被后面放的物体压着,只有等上面后放的物品拿出来后,才能…...
Python循环控制语句
1. 循环类型概述 Python提供两种主要的循环结构: while循环 - 在条件为真时重复执行for循环 - 遍历序列中的元素 2. while循环 基本语法 while 条件表达式:循环体代码示例 count 0 while count < 5:print(f"这是第{count1}次循环")count 13. f…...
微信小程序(下)
目录 在事件处理函数中为 data 中的数据赋值 事件传参 bindinput 的语法格式 实现文本框和 data 之间的数据同步 条件渲染 结合 使用 wx:if hidden wx:if与 hidden 的对比 wx:for 手动指定索引和当前项的变量名 wx:key 的使用 WXSS 和 CSS 的关系 什么是 rpx 尺寸…...
【零基础入门unity游戏开发——2D篇】2D 游戏场景地形编辑器——TileMap的使用介绍
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
vector的介绍与代码演示
由于以后我们写OJ题时会经常使用到vector,所以我们必不可缺的是熟悉它的各个接口。来为我们未来作铺垫。 首先,我们了解一下: https://cplusplus.com/reference/vector/ vector的概念: 1. vector是表示可变大小数组的序列容器…...
ubuntu 22.04 解决LXC 报错CGroupV1 host system
解决CGroupV1 host system 报错 echo "cgroupv1 environment" sed -i s/^GRUB_CMDLINE_LINUX.*/GRUB_CMDLINE_LINUX_DEFAULT"quiet splash systemd.unified_cgroup_hierarchy0" / /etc/default/grub update-grub reboot 下载oracle 7 Linux 容器测试 l…...
JavaEE初阶复习(JVM篇)
JVM Java虚拟机 jdk java开发工具包 jre java运行时环境 jvm java虚拟机(解释执行 java 字节码) java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件>.class文件(字节码文件) 字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为…...
MINIQMT学习课程Day9
获取qmt账号的持仓情况后,我们进入下一步,如何获得当前账号的委托状况 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件 导入包: from xtquant import xtdata from xtqua…...
动态规划似包非包系列一>组合总和IIV
目录 题目分析:状态表示:状态转移方程:初始化填表顺序返回值:代码呈现: 题目分析: 状态表示: 状态转移方程: 初始化填表顺序返回值: 代码呈现: class Soluti…...
Java 二叉树非递归遍历核心实现
非递归遍历的核心是用栈模拟递归的调用过程,通过手动维护栈来替代系统栈,实现前序、中序和后序遍历。以下是三种遍历的代码实现与关键逻辑分析: 一、二叉树遍历 1.1、前序遍历(根 → 左 → 右) 核心逻辑:…...
JavaScript性能优化实践:从微观加速到系统级策略
JavaScript性能优化实践:从微观加速到系统级策略 引言:性能优化的"时空折叠"思维 在JavaScript的世界里,性能优化如同在时间与空间的维度中折叠代码。本文将通过"时空折叠"的隐喻,从代码执行效率(时间维度)和内存占用(空间维度)两大核心,结合现代…...
《P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题》
题目描述 输入两个正整数 x0,y0,求出满足下列条件的 P,Q 的个数: P,Q 是正整数。 要求 P,Q 以 x0 为最大公约数,以 y0 为最小公倍数。 试求:满足条件的所有可能的 P,Q 的个数。 输入格式 一行两个正整数 x0,y0。…...
【力扣hot100题】(052)课程表
什么人一学期要上2000节课啊jpg 看了非常久都没思路,主要是数据结构还没复习到图论,根本没思路怎么储存一个图…… 唯一记得的就是两种存储方法,一种是二维数组法,记录每一条边的有无,一种是只记录有的边,…...
SpringBoot配置文件多环境开发
目录 一、设置临时属性的几种方法 1.启动jar包时,设置临时属性 2.idea配置临时属性 3.启动类中创建数组指定临时属性 二、多环境开发 1.包含模式 2.分组模式 三、配置文件的优先级 1.bootstrap 文件优先: 2.特定配置文件优先 3.文件夹位置优…...
RSA和ECC在密钥长度相同的情况下哪个更安全?
现在常见的SSL证书,如:iTrustSSL都支持RSA和ECC的加密算法,正常情况下RAS和ECC算法该如何选择呢?实际上在密钥长度相同的情况下,ECC(椭圆曲线密码学)通常比RSA(Rivest-Shamir-Adle…...
Dive into Deep Learning - 2.4. Calculus (微积分)
Dive into Deep Learning - 2.4. Calculus {微积分} 1. Derivatives and Differentiation (导数和微分)1.1. Visualization Utilities 2. Chain Rule (链式法则)3. DiscussionReferences 2.4. Calculus https://d2l.ai/chapter_preliminaries/calculus.html For a long time, …...
【备考高项】附录:合同法全文(428条全)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 第一章 一般规定第二章 合同的订立第三章 合同的效力第四章 合同的履行第五章 合同的变更和转让第六章 合同的权利义务终止第七章 违约责任第八章 其他规定第九章 买卖合同第十章 供用电、水、气、热力合同第十…...
Ubuntu安装Podman教程
1、先修改apt源为阿里源加速 备份原文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 修改源配置: vim sources.list删除里面全部内容后,粘贴阿里源: deb http://mirrors.aliyun.com/ubuntu/ focal main re…...
9.进程信号
信号量 信号量是什么? 本质是一个计数器,通常用来表示公共资源中,资源数量多少的问题。 公共资源:可以被多个进程同时访问的资源。 访问没有保护的公共资源会导致数据不一致问题 什么是数据不一致问题 由于公共资源…...
python爬虫:小程序逆向(需要的工具前期准备)
前置知识点 1. wxapkg文件 如何查看小程序包文件 打开wechat的设置: .wxapkg概述 .wxapkg是小程序的包文件格式,且其具有独特的结构和加密方式。它不仅包含了小程序的源代码,还包括了图像和其他资源文件,这些内容在普通的文件…...
PGSQL 对象创建函数生成工具
文章目录 代码结果 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>PGSQL 函数生成器</tit…...
查询当前用户的购物车和清空购物车
业务需求: 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…...
八、重学C++—动态多态(运行期)
上一章节: 七、重学C—静态多态(编译期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章节代码: cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 码云 - 开源中…...
react redux的学习,多个reducer
redux系列文章目录 第一章 简单学习redux,单个reducer 前言 前面我们学习到的是单reducer的使用;要知道redux是个很强大的状态存储库,可以支持多个reducer的使用。 combineReducers combineReducers是Redux中的一个辅助函数,主要用于…...
饮食助力进行性核上性麻痹患者,提升生活质量
进行性核上性麻痹是一种少见的神经系统变性疾病,患者会出现姿势不稳、眼球运动障碍等症状。合理的饮食对于维持患者身体机能、延缓病情发展有重要意义。 高蛋白质食物是饮食结构的重要部分。像瘦肉、去皮禽肉、鱼类、豆类及其制品,还有低脂奶制品等&…...
leetcode117 填充每个节点的下一个右侧节点指针2
LeetCode 116 和 117 都是关于填充二叉树节点的 next 指针的问题,但它们的区别在于 树的类型 不同,117与 116 题类似,但给定的树是 普通二叉树(不一定完全填充),即某些节点可能缺少左或右子节点。 树的结构…...
