解决Python打包成exe文件大启动慢的问题
1. 问题描述
在日常工作中经常使用Python的小伙伴会经常需要把py文件打包成exe文件给别人使用,这样的好处就是别人不需要安装所需要的python环境和所依赖的库即可运行你的程序。我们通常使用pyinstaller工具来打包成exe可执行文件:
pyinstaller -F yourFile.py
但是这样打包成的exe非常大,动辄几百M,然后打开之后启动非常慢,30s以上才有反应。这种肯定不利于日常使用,那么造成这个现象的原因是什么?有没有什么方法可以解决这个问题呢?
2. 产生原因
造成这个问题的原因在于pyinstaller在打包py文件的时候,并不会智能地把你文件中需要的库打包进去,而是偷懒把当前环境中所有已经安装的库都给你打包进去了,所以我们最后得到的exe文件才会很大,从而导致启动很慢。
2. 解决方法
解决方法很简答,我们需要在一个新的虚拟环境中打包就好了。以anaconda为例,它需要三个步骤:1.建立虚拟环境,2.安装py文件所依赖的库,3.利用pyinstaller打包。
2.1 建立虚拟环境
使用的anaconda建立虚拟环境的指令:
conda create -n yourEnvName python=3.6.5
其中yourEnvName 是虚拟环境的名字,python的版本根据号自己的序号来选择。
建立完环境之后进行激活即可:
activate yourEnvName
2.2 安装所需库
进入到我们建立的环境之后,安装我们所需要的库即可,当然,pyinstaller也是需要安装的:
pip install pyinstaller
2.3 在环境中打包
安装完我们工程所需要的库之后,就可以在虚拟环境中打包了:
pyinstaller -F yourPyFile.py
打包之后我们发现,生成的exe文件的大小变为了几十M(虽然也很大),启动时间缩短为了小于10s(虽然也不短),但比之前的结果好多了。
2.4 附pyinstaller参数表
对于pyinstaller工具,其选项参数列表如下所示:
选项 | 描述 |
---|---|
-F | 生成结果是一个exe程序,所有的第三方依赖库和其他资源都被打包成进该exe程序中 |
-D | 生成结果是一个包含exe程序的目录,所有第三方依赖库和其他资源和exe程序位于同一目录下 |
-i | 为生成的程序指定一个icon图标 |
-c | 显示命令行窗口 |
-w | 不显示命令行窗口 |
-n | 指定生成的exe和spec文件名 |
-distpath | 指定打包后的程序存放目录,默认存放在当前目录下的dist目录 |
-workpath | 为输出的所有临时文件指定存放目录 |
-h | 显示帮助信息 |
-v | 显示版本号 |