您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
桌面应用打包:pyinstaller
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
桌面应用打包:pyinstaller
自猿其说Tech
2022-08-11
IP归属:未知
36160浏览
### 1 背景 在使用python开发一些小工具时,如果其他人电脑中没有python环境或者没有安装相应的第三方库,是没办法运行的,而要求对方安装又不现实,尤其是对方不是技术人员,因此如何将一个独立的python程序,使它成为成为一个不用考虑环境,双击即可运行的桌面应用呢?使用pyinstaller打包是一个不错的选择。 ### 2 什么是pyinstaller pyinstaller是一个支持跨平台使用的第三方库,它可以将脚本执行所需的模块和库,自动分析、收集并生成一个文件夹或者可执行文件。 ![](//img1.jcloudcs.com/developer.jdcloud.com/3a71afa5-a04b-491f-a8e2-ece9867b8ea520220811174817.png) 以下示例使用windows环境,由于pyinstaller的跨平台性,与类unix环境命令一样,只是最终生成的可执行文件不一样。 ### 3 如何安装 安装pyinstaller模块与安装其他python模块一样,使用pip命令安装即可。 pip install pyinstaller 安装输出结果: ![](//img1.jcloudcs.com/developer.jdcloud.com/7306972f-fb1c-4dd4-9f1f-11953063825020220811174832.png) 其中的 altgraph、future等代表 PyInstaller 模块依赖环境。 ### 4 如何使用 #### 4.1 常用命令介绍 pyinstaller + 选项 + python入口源文件 主要选项包括: - -F 打包成一个exe文件(如果是多个py文件,下面有解决办法) - -D 自动创建一个包含桌面应用文件的目录,包括所有运行依赖文件(默认选项) - -w 指定程序运行时,不显示命令行窗口(仅对windows有效) - -i + ico路径 可以更换应用图标(如果是当前文件夹下,不用添加ico路径) - -d 产生debug版本的exe文件 - -o 指定.spec文件生成目录,如果没有指定,将会在当前根目录下输出 - -n 指定.spec文件名字,如果省略,主文件名将作为.spec的文件名字 - -p 设置导入路径,可以使用路径分隔符(windows是分号,类unix是冒号) #### 4.2 常用方式举例 ##### 4.2.1 打包成单个文件 使用以下命令将会使python脚本,打包成为一个exe文件。 pyinstaller -F -w -i "./dian_128.ico" start_dian.py 其中: - -F 命令打包成单个文件 - -w 无命令行窗口 - -i 指定exe文件icon图标 执行成功后,将会在根目录生成两个文件夹,其中“build”文件中包含的是所有依赖文件,“dist”文件夹中存放着本次生成的exe文件。 ![](//img1.jcloudcs.com/developer.jdcloud.com/0e94e354-9b0f-4474-bd41-397920b7e6fc20220811174914.png) ##### 4.2.2 打包成文件夹 使用以下命令将会使python脚本,打包成为一个文件夹。 pyinstaller -D -w -i "./dian_128.ico" start_dian.py 其中: - -D 命令打包成一个文件夹 - -w 无命令行窗口 - -i 指定exe文件icon图标 命令行执行成功后,将会在dist目录下生成一个start_dian的子目录,该目录中包含了大量的.dll文件和.pyz文件,都是exe文件的支撑文件。 ![](//img1.jcloudcs.com/developer.jdcloud.com/eb83f533-9ea3-453a-a8a3-17619c9060ef20220811174938.png) #### 4.3 使用.spec文件配置编译 上面讲解的都是通用版本,不太灵活,如果想要加入新的资源,或每次编译不想输入很长的命令,可以使用.spec文件,进行定制化配置编译。 ##### 4.3.1 生成.spec文件 使用上面的方式进行编译后,如未指定.spec生成目录,会在当前根目录生成一个与编译py文件同名的.spec文件; 或使用命令pyi-makespec -F start_dian.py,将会直接生成.spec文件; ![](//img1.jcloudcs.com/developer.jdcloud.com/5cd4a600-685e-4559-883f-7b98c1ab8b5820220811175001.png) ##### 4.3.2 spec文件内容介绍 打开spec文件 ![](//img1.jcloudcs.com/developer.jdcloud.com/84b08e8d-8a51-4d2d-ad66-97b16885558e20220811175016.png) 这里仅对涉及到的几个关键变量进行解释: ###### 1.Analysis: - ['start_dian.py']:是主文件以及全部依赖文件,如果依赖文件都在同一目录下可以不写; - oathex:项目的绝对路径; - datas:添加资源文件,例如文件夹、图片、excel等等,以元组入参,第一个参数为原始路径,第二个参数为编译后的目标路径; ![](//img1.jcloudcs.com/developer.jdcloud.com/dc39e6bf-0441-4201-9d4e-c22ee1a219fb20220811175042.png) ###### 2.EXE: - console:是否开启命令行,默认为True(开启); - icon:编译出exe可执行文件产物的图标,必须使用绝对路径; - name:EXE内和COLLECT内的name都是编译后的文件名,默认与编译主文件同名; ##### 4.3.3 spec文件编译 配置好的spec文件,执行命令进行编译,不再需要其他参数: pyinstaller start_dian.spec ![](//img1.jcloudcs.com/developer.jdcloud.com/91adbe62-1501-4d97-97b3-9c65891a876720220811175111.png) ##### 4.3.4 以下四种情况,修改spec文件比较好: 1. 当您需要将资源文件与exe文件捆绑在一起时; 2. 当您的依赖文件包括.dll或.so文件时; 3. 当您运行exe需要运行参数时; 4. 当您需要合并多程序包成为通用模块时; ### 5 常见问题 ###### 1.多文件如何打包 - 在.spec文件中Analysis参数hiddenimports中添加导入模块名称,修改后,可再次进行打包,将会解决exe文件依赖包找不到的问题; - 在命令中使用-p 主文件 + -p 引入文件 ...,可以直接生成exe文件。 ###### 2.exe文件过大 - 安装python虚拟环境; - 导入包时,使用form + 包名 + import + 功能函数,不要直接import + 包名。 ###### 3.出现莫名其妙的错误 - python文件所在的全路径,尽量不要有中文存在。 ###### 4.打包成一个文件夹后,发送给其他人无法使用 - 需要将dist下面的文件夹整体发送,保持exe文件与dist下面文件夹的路径不变。 ###### 5.运行exe文件后,没有达到预期效果 - 文件报错了,重新打包文件,使用控制台(去掉-w参数),将会在控制台显示程序运行过程与打印错误。 ###### 6.python脚本主要是命令行输出,但是程序执行完后就退出无法查看输出信息 - 在python脚本最后一行添加命令:os.system("pause")或者raw_input("输出任意按键即可退出")。 ------------ ###### 自猿其说Tech-JDL京东物流技术与数据智能部 ###### 作者:骆铜磊
原创文章,需联系作者,授权转载
上一篇:浅谈Airtest图像识别原理
下一篇:Redis数据倾斜与JD开源hotkey源码分析揭秘
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号