python打包成exe,太大了该怎么解决?
这是一个很长的故事,嫌长的直接看最后的结论
事情经过
上周接了个需求,写了个小工具给客户,他要求打包成exe文件,这当然不是什么难事。因为除了写Python的,绝大多数人电脑里都没有Python编译器,所以打包成exe,让用户(windows)双击就可以打开,也算是必备技能了。
直接用Pyinstaller,打开cmder:
pyinstaller -Fw E:\test\url_crawler.py
(-F 是打包成一个文件,-w是不出现调试窗口,因为我的小工具里有GUI,所以不用默认的调试窗口)
等了好久,终于完成打包,一看文件,嚯,200M!怪不得打包了这么久...
上网查了下资料,有人说,Anaconda里内置了很多库,打包的时候打包了很多不必要的模块进去,要用纯净的Python来打包。
有点道理,想着装虚拟机时间更长,准备拿出闲置的笔记本,重新装个Python来打包。
可刚巧我最近在学flask的时候,用到pipenv,虽然还不懂pipenv的强大之处,但知道它是个管理虚拟环境和包的工具,于是想着能不能用pipenv来创建一个新的python编译器以运行pyinstaller进行打包。
于是赶紧上网查了一下,pipenv pyinstaller,没有搜到有用的信息,干脆自己试一试,反正pipenv操作不麻烦。
打开cmder:
#建立虚拟环境
pipenv install
#进入虚拟环境
pipenv shell
#安装模块
pip install 小工具.py里面用到的模块
#打包的模块也要安装
pip install pyinstaller
#开始打包
pyinstaller -Fw E:\test\url_crawler.py
打包完成,一看大小,11M!成功!
后来因为客户改了需求,我又改了一下源代码,然后换了个目录用pipenv重新打包,结果打包完又变回200M!尝试了无数次,怎么也回不到过去的20M!我都怀疑之前的20M是我的幻觉了。
不过无论如何要先交差,200M的“小“工具,用户体验肯定不行,所以我就用排除法,看看是哪个模块占的体积大,再想办法优化。最先怀疑的是GUI,我几乎毫不犹豫地认定是它,我用的是PySimpleGUI(强烈推荐,基于tkinter),先把PySimpleGUI的内容注释掉,再进行打包,你们猜打包完有多大?
198M!
可直接联系客服QQ交代需求:953586085
看来是我错怪他了,经过几次排除,发现了罪魁祸首就是:fake_useragent
这个库是用来伪装请求头的,主要是我懒得复制user-agent,所以问题不大,把fake_useragent注释掉,自己手动粘贴一个user-agent就行了
#from fake_useragent import UserAgent
#ua = UserAgent()
#headers = {'user-agent':ua.random}
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36'}
不用fake_useragent,打包成exe是 14M,已经不错了,先交差再说
之后经过了多次探索,多次放弃的边缘(反复删除创建环境),终于找到了完美打包的方法
结论
关键点就一个:要在虚拟环境里安装pyinstaller
如果你没有在虚拟环境中安装pyinstaller,你同样可以使用pyinstaller命令,但是调用的是你系统原本的那个python编译器,内含很多关联库,导致即使在虚拟环境中,你打包的exe文件仍然非常大。
另外一点要注意的是:要在虚拟环境里安装好你py文件中调用的库,不然打包出来也没法正常运行。
最后再复习一下正确流程 (前提是安装好pipenv):
#建立虚拟环境
pipenv install
#进入虚拟环境(上一步可省略,因为没有虚拟环境的话会自动建立一个)
pipenv shell
#安装模块
pip install requests pyquery pysimplegui fake_useragent
#打包的模块也要安装
pip install pyinstaller
#开始打包
pyinstaller -Fw E:\test\url_crawler.py
python打包成exe,太大了该怎么解决?的更多相关文章
- Python打包成exe,文件太大问题解决办法
Python打包成exe,文件太大问题解决办法 原因 解决办法 具体步骤 情况一:初次打包 情况二:再次打包 原因 由于使用pyinstaller打包.py文件时,会把很多已安装的无关库同时打包进去, ...
- Python打包成exe可执行文件
Python打包成exe可执行文件 安装pyinstaller pyinstaller打包机制 Pyinstaller打包exe 总结命令 可能会碰到的一些常见问题 我们开发的脚本一般都会用到一些第三 ...
- python打包成exe
目前有三种方法可以实现python打包成exe,分别为 py2exe Pyinstaller cx_Freeze 其中没有一个是完美的 1.py2exe的话不支持egg类型的python库 2.Pyi ...
- 关于python打包成exe的一点经验之谈
我经常用python写些脚本什么的,有时候脚本写完以后,每次运行都得在IDE打开在运行,很麻烦,所以经常将python编译成exe.SO...有了一点经验,在这和大家分享一下. python ...
- Python打包成exe,pyc
D:\mypython\path\ C:\Python27\Scripts\pyinstaller.exe -w mypython.py # Python打包成exe D:\mypython\path ...
- Python打包成exe程序
如何把.py文件打包成.exe可执行程序. 这里选择用PyInstaller 3.0来打包,PyInstaller 3.0下载地址:https://pypi.python.org/pypi/PyIns ...
- 將Python打包成 exe可执行文件
利用Python寫了一個小腳本想要傳給使用Windows但沒有裝Python的朋友執行,這時候就可以利用將檔案包裝成exe檔案,讓沒有Python的朋友也可以執行.本篇將介紹利用套件「PyInstal ...
- 【Python打包成exe方法】——已解决导入第三方包无法打包的问题
前言 在我们写代码的过程中,我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安 ...
- py库:把python打包成exe文件(pyinstaller)
http://blog.csdn.net/be_quiet_endeavor/article/details/73929077 用Pyinstaller把Python3.4程序打包成可执行文件exe ...
随机推荐
- JS 中document.write()的用法和清空的原因浅析(转)
转自:https://www.jb51.net/article/129715.htm
- python练习:面向对象1
面向对象习题: 一:定义一个学生类.有下面的类属性: 1 姓名 2 年龄 3 成绩(语文,数学,英语)[每课成绩的类型为整数] 类方法: 1 获取学生的姓名:get_name() 返回类型:str 2 ...
- Vue+VSCode开发环境搭建
时间2019.9月 1. 安装 nodeJS; 安装VScode 安装好nodeJS之后,默认会安装好npm 测试 nodeJS 和npm是否可以执行 node -v npm -v 1.1 VScod ...
- vue基础部分
一 vue概念 是一个构建用户界面的javascript框架 二 如何使用vue 1. 导入vue.js文件 2. 展示HTML 3. 建立vue对象,写JavaScript代码 vue的简单实用:申 ...
- iview-admin本地测试上线登陆问题和文件路径找不到问题
在项目中vue.config.js下修改上线路径(图中我修改为:根目录路径) 测试本地上线登陆出现问题: 在main.js下if (process.env.NODE_ENV !== 'producti ...
- JS中浏览器的数据存储机制
一.JS中的三种数据存储方式 cookie.sessionStorage.localStorage 二.cookie 1.cookie的定义: cookie是存储在浏览器上的一小段数据,用来记录某些当 ...
- 在iframe内页触发顶层页面body的blur事件
//在iframe内页触发顶层页面body的blur事件. if (window != top) { $(document.body).click(function () { $(top.docume ...
- Docker基础理论整理(精简)
目录 一.什么是docker,docker的概念 二.docker中的镜像 三.docker中的容器 四.docker中的仓库 五.docker的网络通信 bridge模式 host模式 contai ...
- Android笔记(二十) Activity中的跳转和值传递
我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 显式Intent跳 ...
- Scyther Advanced Topics
建立非对称秘钥对 声明一个公钥函数和一个私钥函数: const pk2: Function ; const sk2: Function : 我们还声明这些函数代表非对称密钥对: inversekeys ...