基于Pyinstaller打包Python程序并压缩文件大小


Posted in Python onMay 28, 2020

这段时间应老师的要求,给实验室写了一个基于 PyQt5 的小工具。然而源码发过去人家还不要,一定要打包成可执行软件。

那就打包呗,刚好以前对 Pyinstaller 有一点接触,就用了一下这玩意。这篇博文主要记录一下基本用法和踩得一些坑。

1. 用 Pyinstaller 打包 Python 程序

首先我们需要安装 Pyinstaller:

pip install pyinstaller

用 conda 也行,不过貌似最近清华的 Anaconda 源被封了,也不知道什么时候解禁。

Pyinstaller 用法很简单,在对应的主调 py 文件的目录下,运行:

pyinstaller [<args>] Target.py

介绍一下 Pyinstaller 常用的参数用法:--distpath <path>: 打包到哪个目录下-w: 指定生成 GUI 软件,也就是运行时不打开控制台-c: 运行时打开控制台-i <Icon File>: 指定打包后可执行文件的图标--clean: 在构建之前清理PyInstaller缓存并删除临时文件

关于打包成什么样,有两种选择:

-D: 创建包含可执行文件的单文件夹包,同时会有一大堆依赖的 dll 文件,这是默认选项-F: 只生成一个 .exe 文件,如果项目比较小的话可以用这个,但比较大的话就不推荐

最后来看看我使用的参数:

pyinstaller --distpath Release/ -w -i x.ico --clean main.py

如果不指定 --dispatch 的话,最后会默认发布到 dis 目录下,进入目录后,就可以看到打包好的软件:

基于Pyinstaller打包Python程序并压缩文件大小

怎么样,看上去是不是就和正规软件一毛一样了!

不过还没完,因为软件有可能运行不了。

2. 加入依赖项

当我兴冲冲地去运行程序时,出现了这么一个玩意:

基于Pyinstaller打包Python程序并压缩文件大小

Failed to excute script xxx

啥?为啥会这样。其实这种情况往往是缺少了一些依赖项导致的。以我的例子来说,我的项目中有一个 config.yaml 文件需要在运行时读取,然而 Pyinstaller 是不会帮你把这些依赖项目也打包的。

解决办法很简单,手动把依赖项目复制进目录下就可以了。

OK!到此为止就完——了吗?

NO!因为我遇到了一个很恶心的问题,打包出来的程序居然足足有 600 多 M!坑人呐这不是!

我苦思冥想不知道是怎么回事,转眼一看,发现了一些不对劲的地方。

基于Pyinstaller打包Python程序并压缩文件大小

Excuse me? 我啥时候用过 Numpy 了?我转眼一想就明白了,肯定是这货偷偷把一些不相干的库也打包进来了。后来我上网上一查,有知乎大佬说是因为“Anaconda里内置了很多库,打包的时候打包了很多不必要的模块进去,要用纯净的Python来打包。”

我用的方法是使用 pipenv 来打包。

3. 使用 Pipenv

Pipenv 是一款管理虚拟环境的命令行软件,简单来讲,它可以创建一个只在某个目录下的局部 Python 环境,而这个环境是可以和全局环境脱离开的。

步骤如下:

安装 Pipenv

pip install pipenv

选一个好目录做我们的虚拟环境,然后在该目录下:

pipenv install --python 3.7

这样就可以在目录下创建一个局部的环境了,我这里设为 3.7 是因为我自己用的是 3.7,具体设什么根据自己的情况来定。

在命令行下激活环境

pipenv shell

输入这个命令,我们就进入到了新建的虚拟环境。如果你这时候使用命令 pip list 并发现里面只有很少的库,这就说明我们成功进入虚拟环境了(有点像 Conda)。

安装依赖的库

在虚拟环境下安装 Pyinstaller 和你自己的脚本依赖的第三方库,比如我的就是:

pipenv install pyinstallerpipenv install pyqt5pipenv install pymysqlpipenv install geopy

再次查看 pip list 时,如果都成功安装好了,我们就可以开始打包了。

把你的脚本放到这个目录下面,运行 pyinstaller,方法同前

这时我们就会用虚拟环境下的 pyinstaller 来打包库,由于这个环境比较纯净,所以即便它想乱打包其他的库也打包不了。

打包完毕后,你就会发现,很明显干净多了:

基于Pyinstaller打包Python程序并压缩文件大小

再一看,一共 90 M,足足缩小了 6 倍多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python专用方法与迭代机制实例分析
Sep 15 Python
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
python批量图片处理简单示例
Aug 06 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
详解Python常用的魔法方法
Jun 03 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 #Python
Python爬虫requests库多种用法实例
May 28 #Python
在pycharm中创建django项目的示例代码
May 28 #Python
python中有函数重载吗
May 28 #Python
Python可以实现栈的结构吗
May 27 #Python
Python如何脚本过滤文件中的注释
May 27 #Python
Python如何获取文件指定行的内容
May 27 #Python
You might like
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Python正则表达式匹配中文用法示例
2017/01/17 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
python模块smtplib学习
2018/05/22 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
什么是继承
2013/12/07 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
高级编程求职信模板
2014/02/16 职场文书
学校端午节活动方案
2014/08/23 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
单位租房协议范本
2014/12/03 职场文书
给老师的感谢信
2015/01/20 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
学校社团活动总结
2015/05/07 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python