一、场景
通常来说,我们开发的 python 脚本一般都会用到一些第三方的包,并且需要对应版本的 python 解释器。因此在 python 脚本在不同的主机上运行的时候相对来说不是很方便,为此可以通过 pyInstaller 将脚本和解释器打包成可执行文件(在 windows 可以打包成 exe,在 linux 下可以打包成可执行文件),让更多的人去使用它。
二、安装
2.1 pyInstaller 介绍
pyInstaller 是一个将 python 文件打包成可执行文件的库,它除了支持 windows 平台,还支持 Linux 模块。pyInstaller 会将 python 解释器、脚本中用到的第三方库函数以及相应的脚本一并打包到可执行文件中。
2.2 pyInstaller 安装
pip install pyinstaller
在 conda 中安装 pyinstaller
结果如下图所示。
三、打包
-
在 miniconda 中创建了一个名为
python39
的环境,并在环境中安装pyInstaller
库
-
通过
cd
命令转移到主文件所在的项目目录中,如cd ./Workshop\Python\es-cluseter-health-check
-
打包项目的启动文件,我的启动文件为
main.py
,因此我的命令为Pyinstaller -F main.py
,这个过程需要稍微等个一两分钟。
-
如果没有指定目录的话,打包的程序会在当前目录中新建的
dist
中,并且项目中有文件用到了相对路径,需要把那些用到的文件再拷贝一份放到dist目录下。
3.1 常用打包命令
打包可执行文件:Pyinstaller -F main.py
不带控制台的打包:Pyinstaller -F -w main.py
指定可执行文件图标打包(仅windows):Pyinstaller -F -i chinaunicom.ico main.py
指定可执行文件图标并且不带控制台的打包(仅windows):Pyinstaller -F -w -i chinaunicom.ico main.py
四、相关问题
4.1 打包成功却不能正确执行,进程无法阻塞,可执行文件一直在循环
这是因为可执行文件在调用某些模块的时候,也是进程,而在多进程中。可执行文件的主进程不会被阻塞,会一直循环起进程。可以在启动文件中,例如 main.py
中加入以下代码,要放在 import 模块之前。
from multiprocessing import freeze_support
freeze_support()
4.2 路径问题
如果在项目中有图片等资源,是需要根据程序中的相对路径复制到 dist
文件中。这里推荐使用相对路径,因为以绝对路径加载资源的方式,当可执行文件分发到其他机器上执行的时候,可能会因为目录问题导致可执行文件无法正确加载资源。
4.3 打包的启动文件问题
这里只能指定一个要打包的文件,也就是启动文件。其中启动文件中,资源加载目录不能有中文也不要有空格。并且在启动文件中不要有以下判断。
if __name__=='__main__':
如果可执行文件在其他主机上运行时弹出 找不到msvcr100.dll
时,手动将 msvcr100.dll
拷贝到 dist
目录下即可。
4.4 养成良好习惯
在项目中用什么函数导什么函数,不要 import
整个库函数,否则一个100 KB 的代码打包出来有 500 MB