1.打包目的
使python脚本支持在没有预装python环境的电脑上也能运行。
2.pyinstaller 打包命令及运行步骤
使用python的第三方库pyinstaller 做为打包工具,联网状态下使用下列命令在线安装即可:
pip install pyinstaller
pyinstaller两种打包方式:
-
法一:文件夹模式打包
所谓文件夹模式打包就是打包后在dist文件夹中,会生成一个默认跟脚本名同名的文件夹 ,这个文件夹就是我们需要的了——其中有可执行文件以及相关依赖 执行命令:pyinstaller demo.py (其实是有个-D参数的,只是当做默认值了)
-
法二:单文件模式打包
所谓单文件模式打包就是打包后在dist文件夹中只有一个可执行文件,全部的依赖文件都已经被打包进去了。这样很方便,对不怎么懂编程或者电脑操作不是很熟练的客户来讲也比较友好。
执行命令:pyinstaller -F demo.py
命令执行过程中的运行步骤:
该命令执行, pyinstaller会分析demo.py文件,并且在脚本demo.py所在文件夹中:
生成demo.spec (spec文件中存储着打包时所用的命令以及要打包的相关文件,它的作用就是告诉PyInstaller如何来进行处理。正常使用中我们是不需要管spec文件的,如果是需要打包资源文件,多程序打包等才要。)
创建文件夹build
在build文件夹中生成日志文件和运行所需文件
创建dist文件夹
在dist文件夹中创建跟脚本名同名的文件夹demo,在demo文件夹中,就可以找到demo.exe可执行文件
如果要给其他人使用:
- 若用文件夹模式打包,需要把dist文件夹下打包好的整个demo文件夹发过去,而你的朋友或者客户只需要点击文件夹中的demo.exe可执行文件即可运行程序。
- 若用单文件模式打包,读者把dist文件夹下的demo.exe可执行文件发过去即可
build文件夹和spec文件跟程序运行没有关系,可以删掉。
spec文件中主要包含4个class: Analysis, PYZ, EXE和COLLECT
- Analysis以py文件为输入,它会分析py文件的依赖模块,并生成相应的信息
- PYZ是一个.pyz的压缩包,包含程序运行需要的所有依赖
- EXE根据上面两项生成
- COLLECT生成其他部分的输出文件夹,COLLECT是可选的
3.打包成文件夹和单一可执行文件的区别
- 文件夹模式中的exe需要依赖当前文件夹中的文件,不能拷贝到其他位置单独运行,而单一可执行文件是支持的。
- 单一可执行文件比文件夹的启动时间要长,因为当程序运行时,单一的可执行文件需要解压程序的第三方依赖文件到临时文件夹中。
4.exe运行原理
文件夹模式:
- 当用户启动程序时,运行的是引导加载程序。引导加载程序创建一个临时的Python环境,以便Python解释器能够在myscript文件夹中找到所有导入的模块和库。引导加载程序启动Python解释器的一个副本来执行您的脚本。如果包含了所有必要的支持文件,那么一切都会正常地从这里开始。
单文件模式:
- 引导加载程序也是单文件包的核心。启动时,它将在此操作系统的适当临时文件夹位置创建一个临时文件夹。该文件夹名为_MEIxxxxxx,其中xxxxxx是一个随机数。一个可执行文件包含您的脚本使用的所有Python模块的嵌入式存档,以及任何非Python支持文件(例如.so文件)的压缩副本。引导加载程序解压缩支持文件并将副本写入临时文件夹。这需要一点时间。这就是为什么一个文件应用程序启动起来比一个文件夹应用程序慢一点的原因。在创建临时文件夹之后,引导装载程序在临时文件夹上下文中继续执行与单文件夹包相同的操作。
5.可能遇到的问题
如果打包不顺利,如双击运行出现类似报错,闪退的问题,可以通过命令行方式运行应用程序,通过错误提示解决。如果通过常规手段排查还是解决不了时,可能是python脚本所依赖的某个库的版本兼容性问题。