解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题


Posted in Python onJuly 13, 2020

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

最近写一个小脚本,源代码200多行,引入了 openpyxl、requests库,写完打包exe之后居然有64MB的大小,真是奇了葩了。网上查找各位大神的做法,自己又动手填了N个坑之后,总算找到缩小exe文件的方法了,这种方法必须使用到pipenv,详细记录如下:

1、安装pipenv

就像安装其他python库一样,在cmd环境下安装:

pip install pipenv

2、安装完成后,随便找一个盘符,在这个盘符的根目录(最好是根目录)新建一个文件夹,作为虚拟环境,然后双击进入该文件夹

3、进入命令行,按住shift键,鼠标右键点击,在菜单中找到 power shell,点击进入

4、在虚拟环境下安装python,例如:

pipenv install --python 3.6

在这里就有可能遇到第一个坑了,系统有可能提示无法转换为 “utf-8”,具体原因是因为中文转码的问题,但是不必深究。这时候最好的方法是重启电脑,对是的,重启电脑,然后不要打开任何其他程序,重复上述第2步、第3步

5、在命令行下激活虚拟环境

pipenv shell

在这里,可能又会遇到刚刚第4步中的问题,系统提示无法转换为“utf-8”,没有办法,再次重启电脑吧,然后重新进入power shell,再尝试运行 pipenv shell

6、安装需要的库

这时候,根据要打包的程序中导入的库,在pipenv环境下重新安装

pipenv install pyinstaller

pipenv install openpyxl

pipenv install requests

安装过程会比较慢,耐心等候就是了。

7、把py脚本文件复制到这个新建的目录下,重新运行 pyinstaller,方法、参数等同以往一样就OK啦。

最后,在pipenv环境下打包完的程序,就只有6.6MB的大小,虽然对于一个200多行代码的脚本来说,看起来还是有点大,但是相比前一个版本,已经缩小了近1/10,勉强可以接受了。

补充知识:python工具pyinstaller打包生成exe文件非常大的原因分析(openpyxl)openpyxl

【python】python的打包工具pyinstaller生成exe非常大的原因分析(openpyxl)openpyxl

-F 打包出来 一个一个都有200多M

from tkinter import *
from tkinter.font import Font
from email.mime.text import MIMEText
from email.header import Header
import tkinter
import tkinter.messagebox
import tkinter.simpledialog
import tkinter.filedialog
import openpyxl
import smtplib
import threading
 
print(3*2)

每次删掉一行,打包一个一个个包进行测试。发现有的包打出来没什么影响。

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

发现有一个包异常,只要有这个包,就是特别大---openpyxl

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

打包时间也特别长

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

检查日志:发现openpyxl 与 pandas numpy有关。

单独将代码提出,用两种方法调用,发现没什么卵用。

from openpyxl import load_workbook
#import openpyxl
workbook = openpyxl.load_workbook('data.xlsx')

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

都还是200多m

PyInstaller very big file size

win7(64bit) 

anaconda ( 3 )

python(3.6) 

pyinstaller (3.4.dev0+469f1fa19)

openpyxl (2.4.8) 

I've made simple code like this:
------code------------------------------------------
#import openpyxl
workbook = openpyxl.load_workbook('data.xlsx')
------code------------------------------------------

 File size (python files) is 1.0 KB.
 But when I create executable using PyInstaller, I get 200 MB file!
 About openpyxl..... Why the generated files are so big?

 Is there a way to decrease file size?

在网上问了外国人,建议说是要安装一个 python的虚拟机器,因为我们安装的是Anaconda,里面很多库连接进去了很多不必要的其他库和包

有道理!

所以,干脆用一台笔记本,安装纯python3.6的环境。并单独把openpyxl 单独下下来,到时候有用。

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

装好后,继续用pip 把 pypiwin32 装好。这里有个坑:

要用 pip install pypiwin32, 而不是 pip install pywin32.

装好后,按照一个不知名的方法,建议把这个 openxyl 解压到pyinstall 的根目录。等下要用。(好像有用)

然后把我的 py文件要打包的。也放到 pyinstaller 根目录。

pyinstaller -F mainGUIversion5.py 打包开始。

打包好后,发现竟然打包完成。 但是运行不了

直接到cmd窗口去运行,发现有少包,见下图,缺什么用pip装什么,这样做,尽量不污染python原生环境。

Need pure python environment!!!

No Anaconda

例如,这个是少了 jdcal包:

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

一次一次打包,一次次运行发现少包。

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

最后发现,ok了!!!! 最后一次打包为 不到8m了。 从200M直接压缩到了 8M,任务完成。

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

运行也正常!

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

第二天开始做一个实验:

看到底是包的问题,还是python 的问题,先将openpyxl包从pyinstaller目录剪切出去,直接放到桌面,不删掉:

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

执行后,发现打包可以,但是程序运行错误,提示“缺少openpyxl”。。错误找到了

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

于是 ,开始pip 安装包。安装后再执行打包。成功!

解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

打包成功!

这么多步骤与尝试下来。得出结论。pyinstaller的正确打包有两种方法:

第一种方法:将需要打包的程序和其所有依赖的包,统一放在pyinstaller的根目录下,直接用-F打包即可成功,少一个包都不行!

第二种方法:安装一个纯净的python环境,然后一步步测试pip,少哪个包就直接安装哪个。

两种方法各有千秋,但是推荐使用第二种方法,因为这种方法相对简便,特别是在不清楚包之间的依赖关系的情况下。

以上这篇解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python实现面向对像的ASP程序实例
Nov 10 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python filter过滤器原理及实例应用
Aug 18 Python
Python使用pyexecjs代码案例解析
Jul 13 #Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 #Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 #Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 #Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 #Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 13 #Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 #Python
You might like
smarty模板引擎之内建函数用法
2015/03/30 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
js继承的实现代码
2010/08/05 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
python连接sql server乱码的解决方法
2013/01/28 Python
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
Python中的True,False条件判断实例分析
2015/01/12 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
python中正则的使用指南
2016/12/04 Python
python分析作业提交情况
2017/11/22 Python
详解python里的命名规范
2018/07/16 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
运动会加油口号
2014/06/07 职场文书
专项法律服务方案
2014/06/11 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js