最近用python写了一些工程,需要把它们编译成可执行的.exe文件。网上主流的方法是使用Pyinstaller进行编译,于是我就顺着这个路线点完了技能树。
本篇博客共介绍了四个问题:
1. 如何管理pipenv环境
2. 如何使用pipenv缩小打包后的exe文件
3. 如何应对pipenv lock时间过长
4. 如何应对failed to execute script pyi_rth_pkgres报错
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
1. 选择一个路径,在该路径下打开命令行,使用pipenv创建一个python虚拟环境
2. 激活虚拟环境,安装各类需要用到的包(参考2.1的命令)
3. 将需要打包的文件移到该路径下,使用pyinstaller进行打包
在2.2中安装包的时候有时候提示包已经成功安装,但是会卡在lock那里很久。网上说需要换国内源,但是我尝试过似乎也不行,最终自己探索了一个方法:
安装包的时候跳过lock,最后统一生成lock文件(见2.1具体指令)。
具体指令:
pipenv install XXX --skip -lock(有点忘记这条指令了)
pipenv install XXX2 --skip -lock .......
pipenv lock
生成了.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文件的方式,而是选择带库文件的方式,这样我们可以在生成的库文件中有选择地去掉我们不需要的库。