HackPython 致力于有趣有价值的编程教学
简介
当我们希望将自己编写好的程序传送给他人使用时,如果对方没有安装 Python 环境就无法使用程序了,我们难以让每个使用者都安装 Python 环境,是否可以在不必安装 Python 环境的前提下使用 Python 程序呢??
可以使用 Pyinstaller 将程序打包,然后再分享给其他人使用,他人使用只需双击运行打包好的程序。
可以通过 pip 来安装,命令如下:
pip 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:禁止命令行弹出
综上所述,最常见的命令为:
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 目录;
此时,进入 dist 目录就可以看见自己的打包文件了。
击 nameauto.exe 文件,效果如下:
效果如下:
这是一个利用 tkinter 构建的程序。
注意事项
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 的教学课程并感觉您的阅读与支持。