解决Python打包成exe⽂件过⼤问题的⼀些⽅法
前⾔
之前有做过Python的pyqt桌⾯应⽤,当时每次更新打包的时候整个⽂件下来都需要300~400M,但是⼀直没有到合适的⽅法解决,⽽是尽量Python少安抓库包,但效果⼀般,最近到了解决⽅法,特此记录,给需要的⼩伙伴⽤~
步骤
1、为什么要打包?
众所周知,Python脚本不能在没有安装Python的机器上运⾏。
那我们如果写了⼀个数据分析/⾃动化办公的⼩脚本,想分享给同事⼩使⽤,可她电脑⼜没有装Python。
这个时候如果将脚本打包成exe⽂件,发送给她,即使她的电脑上没有安装Python解释器,这个exe程序也能在上⾯运⾏。
⼀般步骤:
Pyinstaller -F py_word.py 打包exe
Pyinstaller -F -w py_word.py 不带控制台的打包
Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe图标打包
以上三个是⽐较常⽤的参数,其他参数详见下表
ico图⽚⽣成
1、Python打包为什么⼤?
在压缩打包之前,先简单说⼀下为什么Python打包过⼤?
Python打包exe,不但体积⼤⽽且运⾏奇慢。解释型语⾔⼤都是这个样⼦,只不过Python尤其突出。要解决⼤⽽慢,只能⽤编译型语⾔,如C,C++,甚⾄VB都好很多,体积最⼩的是汇编。
此外,还有知乎⼤佬说是因为“Anaconda⾥内置了很多库,打包的时候打包了很多不必要的模块进去,要⽤纯净的Python来打包。
所以我们可以模拟⼀个新环境,其中只安装我们本次打包所必要的⼯具包即可。
那最适合的就是——虚拟环境了!
2、虚拟环境
Python创建虚拟环境的⽅法有很多,我这⾥⽤的时候Anaconda(⼤家也可以使⽤Virtualenv、Pipenv
来设置虚拟环境等其他⽅法)
先记⼏个命令,很简单
conda create -n 虚拟环境名字 python==3.6  #创建虚拟环境
conda activate 虚拟环境名字              #激活虚拟环境
conda deactivate                          #退出虚拟环境
从开始菜单运⾏“Anaconda Prompt”,出现的界⾯输⼊创建虚拟环境的指令。成功创建了⼀个名字为aotu,且基于python版本3.6的虚拟环境。
在创建过程中需要回复(y/n),Yes,再激活虚拟环境
conda安装的虚拟环境,会把虚拟环境的⽬录⽣成在anaconda安装⽬录下的env⽬录下。
当然我们也可以在刚刚的窗⼝,使⽤命令conda info --envs,来查看conda环境下所有的虚拟环境
3、安装所需的库
上⾯我们已经创建并激活了名为aotu虚拟环境,输⼊conda list可以查看当前虚拟环境⾥已经安装的库。
我们打开所要打包的Python脚本,对⽐上图,发现pandas,docx这两个库还需要额外安装。当然,也不能缺了打包必不可少
的pyinstaller库。
安装库的过程不再赘述
pip install -i pypi.tuna.tsinghua.edu/simple pandas
pip install -i pypi.tuna.tsinghua.edu/simple python-docx
pip install -i pypi.tuna.tsinghua.edu/simple pyinstaller
安装后再看
已成功安装,还有⼀些因为这⼏个库所附带安装的,就不管他们了4、Pyinstaller打包步骤
这⾥就不再重复了,只换个苹果图标试试
Pyinstaller -F -w -i apple.ico py_word.py
⽣成
成功压缩到29.8M,如果不导⼊pandas这位⼤神,应该就可以10多M了
最后再简单总结⼀下虚拟环境+打包的全过程(只三步):
#创建虚拟环境
conda create -n aotu python=3.6
#激活虚拟环境大文件发送
conda activate aotu
#Pyinstaller打包
Pyinstaller -F -w -i apple.ico py_word.py
5、总结⼀些⼩坑
1、上⽂中⼀模⼀样的过程我在两个电脑都执⾏过⼀遍。在其中⼀个上显⽰缺少xlrd这个库,安装后成功打包,也是⼀样的⼤⼩。
2、在安装库是要注意⼀些库名,⽐如docx这个库不要pip install docx,⽽是需要
pip install python-docx
还有⼀些库可能因为版本不同导致不能使⽤,多碰碰壁就好了。
3、为了防⽌打包时候有些库没安装好,可以先在虚拟环境中执⾏⼀下Python脚本。运⾏⽆误的话再打包,⽐较保险。
4、最后,如果想要删除虚拟环境的话,可执⾏下⽅命令
conda remove -n aotu--all
5、打包为exe的话,版本尽量选择python3.6+32位版本,因为win64位系统向下兼容32位程序,但是如果不考虑32位系统的话⽆所谓,直接python64位版本直接打包就可以,只是只能在win64位系统上
跑。
结语
到这⾥,python打包成exe基本算是结束了,记得⼀定要把pip升级成最新版的pip在安装pyinstaller哈。要不然可能会出现莫名奇妙的问题。
扩展其他打包⽅法和注意事项:
1、⽤form import导⼊需要的模块会更好⼀点
2、使⽤. spec配置⽂件打包即可,在. spec中去除掉⽇常⽤不到的⼤的包
3、Nuitka打包