解决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 相关文章推荐
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
Python之py2exe打包工具详解
Jun 14 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
pandas Dataframe行列读取的实例
Jun 08 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
Python argparse模块使用方法解析
Feb 20 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
PHP中extract()函数的定义和用法
2012/08/17 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
node.js中watch机制详解
2014/11/17 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Python读写压缩文件的方法
2020/07/30 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
护理毕业生自荐信范文
2013/12/22 职场文书
文明餐桌活动方案
2014/02/11 职场文书
经费申请报告
2015/05/15 职场文书
志愿服务心得体会
2016/01/15 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
Python如何导出导入所有依赖包详解
2021/06/08 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS