那些比你走得远的人,并不比你聪慧,只是每天多走了一点。坚持,是最强大的力量。

Pyinstall详解

简介

当我们希望将自己编写好的程序传送给他人使用时,如果对方没有安装 Python 环境就无法使用程序了,我们难以让每个使用者都安装 Python 环境,是否可以在不必安装 Python 环境的前提下使用 Python 程序呢🤔?

可以使用 Pyinstaller 将程序打包,然后再分享给其他人使用,他人使用只需双击运行打包好的程序。

可以通过 pip 来安装,命令如下:

1
pip3 install pyinstaller

使用

pyinstaller 最重要的两个参数就是 -F 与 -D 参数。

使用 - F 参数, pyinstaller 会将 python 程序打包成单个可执行文件。

使用 - D 参数, pyinstaller 会将 python 程序打包成一个文件夹,运行程序时,需要进入该文件夹,点击运行相应的可执行程序。

为了美观,还可以通过 - i 参数指定打包程序的图标 (icon),但这个命令只能在 Windows 平台下生效,此外还可以使用 - n 参数指定生成打包文件的名称。

如果你使用了 PyQt5 或 tkinter 开发了界面,通常不会希望程序运行时弹出 cmd 命令行,此时就可以使用 - w 参数。

🙂简单总结一下:

-F:打包 Python 程序为单个可执行文件 -D:打包 Python 程序为一个文件夹 -i:生成图标,只适用于 Windows 平台 -n:指定打包后生成文件的名称 -w:禁止命令行弹出

综上所述,最常见的命令为:

1
pyinstaller -i xxx.ico -n xxx -w -D xxx.py

-i 参数后必须接 .ico 结尾的图标文件 -D 或 -F 后必须接 python 程序的入库程序,常见情况为 main.py

对应依赖比较多的程序,建议使用 -D, -F 更适合单文件的 py 脚本。

简单原理

打包时,pyinstaller 此时会生成相应的 spec 文件,大体流程如下:

🚀1、在脚本目录生成 xxx.spec 文件 (取决于 -n 参数,没传,则与 xxx.py 同名为 xxx);

🚀2、创建一个 build 目录;

🚀3、写入一些日志文件和中间流程文件到 build 目录;

🚀4、创建 dist 目录;

🚀5、生成可执行文件或文件夹到 dist 目录;

注意事项

Pyinstaller 是跨平台的,但并不是指其生成应用是跨平台的,而是 Pyinstaller 本身是跨平台的,在 Windows 平台下,可以打包出 exe 文件。

👹避免打包后,包文件过大

为了避免 Pyinstaller 打包后程序或文件夹过大,如:几百 KB 的程序打包后编程 500M 左右的程序,在引用包时,尽量使用 from … import … 语句,这是因为 Pyinstaller 打包的路径其实是将 python 解释器以及项目中使用的库直接复制过来,所以如果你没事就别 import… ,那么 Pyinstaller 会将整个模块复制过去,此时打出来的包就会很大。

👹考虑路径问题

使用 python 时,要养成使用 os.path.join 的习惯,这不仅可以避免跨平台的路径坑 (windows 路径表达与类 Unix 是不同),又可以在打包时不会出现相对路径的问题,很多 python 程序员编写路径喜欢使用 + 号来链接路径,这会增加项目的维护成本

pyinstaller 打包的项目遇到路径都使用 os.path.join 则可

👹外部数据问题

虽然在上节中,提及了使用外部数据时,可以自定义 spec 文件中的 datas 字段,但我更常用的做法是直接将数据复制过去,不去修改 datas。

比如我的项目中依赖 config 文件夹下的配置文件,执行将 config 文件夹整体直接复制到打包好的文件夹中则可

👹闪屏结束

如果是简单的程序,可能会出现运行可执行程序后出现一闪而过的情况,这种情况下要么是程序运行结束(比如直接打印的 helloWorld),要么程序出现错误退出了。

这种情况要么通过 input () 函数捕捉输入自己主动结束程序,要么就在 cmd 下运行 exe 文件,从而通过 cmd 看到效果

结尾

掌握了 Pyinstaller 后,你就可以将任意程序打包发送给他人了,最后欢迎学习 HackPython 的教学课程并感觉您的阅读与支持。

👋👋