目录
一、安装pyinstaller库
直接命令行pip安装
pip install pyinstaller
二、执行生成exe文件
我们现在有一个雷霆战机的小游戏, 名为plane_war.py
现在我们打开cmd, 进入到该目录下
输入下面的命令
pyinstaller plane_war.py --workpath E:\tmp\plane_tmp --distpath E:\plane --icon="E:\yun_project\Thunderfighter\img\thunderfighter.ico" --runtime-hook="E:\yun_project\Thunderfighter\runtimehook.py"
生成后的效果
三、命令分析
(一)、基础命令
- pyinstaller 指定了当前目录需要制作的python文件
- –workpath 指定了制作过程中临时文件的存放目录
- –distpath 指定了最终的可执行文件目录所在的父目录
- –icon="" 指定了应用程序图标,必须是ico格式
- –runtime-hook="" 将库文件放到单独的一个目录中
- –noconsole 有图形界面可用该参数去掉DOS黑窗口,引用该参数就可以啦,它的缺省值就是True,只对windows有效
注意:
1、能够from xxx import yyy
就尽量不要import xxx
,这样可以减少打包后的体积。
2、最好在纯python环境下打包,在anaconda环境下,会生成很多不必要的包
在线转ico网址 https://www.zamzar.com/convert/png-to-ico/
或者直接取图标网站获取:https://www.easyicon.net/
noconsole 有图形界面可用该参数去掉DOS黑窗口, 我在生成时引用该参数后,生成的EXE文件没法执行了,而其他步骤没有问题,如果没有必要不要使用。
(二)、将库文件单独存放在目录中
上面这样操作后,大家可以发现我们只要运行Send_email.exe文件,但是该目录下却有很多其他的.dll 之类的库文件。
这使得我们要寻找并运行程序时,要在这么多文件中找到 .exe 文件,比较费劲。
我们可以通过如下方法,把这些库文件放到 单独的一个 目录中。 这样.exe所在的目录就显得比较清爽了,也好找到.exe文件了。
我们添加一个Python代码文件,名为 runtimehook.py
其内容如下
import sys
import os
currentdir = os.path.dirname(sys.argv[0])
libdir = os.path.join(currentdir, "lib")
sys.path.append(libdir)
#os.environ['path'] += ';./lib'
上面的命令指定 生成的.exe运行时,会先执行 runtimehook1.py 里面的代码。
这样就会指定 .exe 程序所在的目录下面的lib目录:
Python库搜索路径,这是由 sys.path.append(libdir) 指定的。
动态链接库文件的 搜索路径,这是由 os.environ[‘path’] += ‘;./lib’ 指定的。
上面的命令执行结束后,我们进入到目录distpath\send-eamil 中,新建一个名为 lib 的目录,把除了下面的几个文件之外的所有其他文件都放到lib目录里面。
base_library.zip
byhy.exe
byhy.exe.manifest
python38.dll
我按照博主的步骤操作以后, 生成EXE文件就没法正常运行了, 可能是我没有操作对,还是需要再实验一下。
(三)、利用spec文件进行打包
一般而言,pyinstaller的基本用法已经够用了,但是有特殊需求,比如打包图片资源文件时,就必须用到它的高阶功法了。
首先得了解spec文件,简而言之,spec文件就是一份告诉pyinstaller如何打包的配置文件。
可以通过pyi-makespec demo.py
来生成demo.spec文件。其内容如下:
# -*- mode: python -*-
block_cipher = None
resources = (("inspurer.db", "."), ("dlib_face_recognition_resnet_model_v1.dat", "."),
("shape_predictor_68_face_landmarks.dat", "."), ("close_logcat.png", ".")
, ("open_logcat.png", "."), ("finish_register.png", "."), ("new_register.png", ".")
, ("start_punchcard.png", "."), ("end_puncard.png", "."), ("index.png", "."))
a = Analysis(['workAttendanceSystem.py'],
pathex=['C:\\Users\\lenovo\\Desktop\\test\\python'],
binaries=[],
datas=resources,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='workAttendanceSystem',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='workAttendanceSystem')
对于上面这个文件,需要注意两点:
除了resources配置是我添加修改之外,其余全是自动生成,这个配置是用来添加资源文件的。
pathex是工程的根目录。
生成并配置好spec文件后,我们可以通过pyinstaller demo.spec
来执行打包任务。
可以通过先执行一遍打包命令,然后会自动生成spec文件,然后再修改spec文件。
四、动态导入的库
有的时候,我们运行打包好的程序,会出现导入库错误的提示,比如下面
ImportError: could not import module 'PySide2.QtXml'
PyInstaller 没法分析出动态导入的库有哪些,我们可以通过命令行参数 --hidden-import 告诉它。
比如,如果我们运行出现
could not import module 'PySpder.QtXml'
错误 , 就可以这样
pyinstaller httpclient.py --hidden-import PySpider.QtXml
好啦,本期的分享就到这。小伙伴们如果喜欢的话,欢迎点赞评论走一波。如果有不足之处,还请多多指正呀。
5、踩坑记录
1、pyinstaller打包exe文件闪退解决方案
打开cmd, 进入到文件夹中执行EXE文件, 可以看到错误信息,然后根据错误信息进行改正
参考文章:
1、https://blog.csdn.net/m0_46683744/article/details/106201841
2、https://blog.csdn.net/weixin_44493841/article/details/97887009
3、https://blog.csdn.net/bearstarx/article/details/81054134
4、https://www.jianshu.com/p/48f6dea265eb
5、https://zhuanlan.zhihu.com/p/65731845
6、http://legendtkl.com/2015/11/06/pyinstaller/
来源:oschina
链接:https://my.oschina.net/u/4379065/blog/4303685