【Python】使用Pyinstaller+pipenv将python编译成尽量小的.exe文件

1. 前言

最近用python写了一些工程,需要把它们编译成可执行的.exe文件。网上主流的方法是使用Pyinstaller进行编译,于是我就顺着这个路线点完了技能树。

本篇博客共介绍了四个问题:

1. 如何管理pipenv环境

2. 如何使用pipenv缩小打包后的exe文件

3. 如何应对pipenv lock时间过长

4. 如何应对failed to execute script pyi_rth_pkgres报错

2. 问题解决

2.1 管理pipenv环境

pipenv install :创建虚拟环境

pipenv shell :进入虚拟环境(如果不存在,则创建并进入虚拟环境) 

pipenv install flask: 安装模块

pipenv uninstall flask :卸载模块

pipenv graph:查看模块之间的依赖关系

pip list:查看虚拟环境所有模块

exit() :退出虚拟环境

pip freeze > requirements.txt:导出虚拟环境所有依赖包名

pip install -r requirements.txt :安装项目所依赖全部模块

pipenv uninstall --all :卸载所有包

pipenv lock:生成lockfile

pipenv --rm: 删除虚拟环境

pipenv run python xxx.py: 虚拟环境运行python

2.2 使用pipenv缩小exe文件大小

1. 选择一个路径,在该路径下打开命令行,使用pipenv创建一个python虚拟环境

2. 激活虚拟环境,安装各类需要用到的包(参考2.1的命令)

3. 将需要打包的文件移到该路径下,使用pyinstaller进行打包

2.3 解决pipenv lock时间过长

在2.2中安装包的时候有时候提示包已经成功安装,但是会卡在lock那里很久。网上说需要换国内源,但是我尝试过似乎也不行,最终自己探索了一个方法:

安装包的时候跳过lock,最后统一生成lock文件(见2.1具体指令)。

具体指令:

pipenv install XXX --skip -lock(有点忘记这条指令了)

pipenv install XXX2 --skip -lock .......

pipenv lock

2.4 解决failed to execute script pyi_rth_pkgres

生成了.EXE文件,点击却显示failed to execute script pyi_rth_pkgres,这个问题有好几种解决思路:

1.放弃折腾法:不再使用虚拟环境进行.exe文件的生成,转之避免在.py文件引入不需要的库。尽量使用from...import...来代替Import...。

2.重装上阵法:重新安装pyinstaller,有可能是版本问题。执行以下指令:

pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

3.引入库法:可能是某个隐藏模块引用的缺失。在要打包的.py文件添加以下这句

import pkg_resources.py2_warn

三个方法我都尝试过,法1是一定可以成功的,只不过生成的.exe文件略大,法2据说解决了很多人的问题,推荐试一下,法3也起作用,生成.exe文件后不会报错,但是程序不一定能运行。

上述问题是为了生成尽可能小的.exe文件而做的努力,实际上我还有一种思路想尝试,那就是不选择生成一个.EXE文件的方式,而是选择带库文件的方式,这样我们可以在生成的库文件中有选择地去掉我们不需要的库。

 

你可能感兴趣的:(编程)