<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1561620646111 ql-align-center" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; text-align: left; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<bi style="box-sizing: border-box; display: block;">HackPython 致力于有趣有价值的编程教学</bi>
<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
简介
当我们希望将自己编写好的程序传送给他人使用时,如果对方没有安装 Python 环境就无法使用程序了,我们难以让每个使用者都安装 Python 环境,是否可以在不必安装 Python 环境的前提下使用 Python 程序呢🤔?
可以使用 Pyinstaller 将程序打包,然后再分享给其他人使用,他人使用只需双击运行打包好的程序。
可以通过 pip 来安装,命令如下:
<pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">pip install pyinstaller
</pre>
使用
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:禁止命令行弹出
综上所述,最常见的命令为:
<pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">pyinstaller
i xxx
.
ico
n xxx
w
D xxx
.
py
</pre>
-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 目录;
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1561620646124" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
此时,进入 dist 目录就可以看见自己的打包文件了。
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1561620646128 ql-align-center" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; text-align: left; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
击 nameauto.exe 文件,效果如下:
效果如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1561620646133 ql-align-center" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; text-align: left; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
这是一个利用 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 的教学课程并感觉您的阅读与支持。
网友评论