桌面应用打包:pyinstaller | 京东物流技术团队

1 背景

在使用python开发一些小工具时,如果其他人电脑中没有python环境或者没有安装相应的第三方库,是没办法运行的,而要求对方安装又不现实,尤其是对方不是技术人员,因此如何将一个独立的python程序,使它成为成为一个不用考虑环境,双击即可运行的桌面应用呢?使用pyinstaller打包是一个不错的选择。

2 什么是pyinstaller

pyinstaller是一个支持跨平台使用的第三方库,它可以将脚本执行所需的模块和库,自动分析、收集并生成一个文件夹或者可执行文件。

以下示例使用windows环境,由于pyinstaller的跨平台性,与类unix环境命令一样,只是最终生成的可执行文件不一样。

3 如何安装

安装pyinstaller模块与安装其他python模块一样,使用pip命令安装即可。

pip install pyinstaller

安装输出结果:

其中的 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文件。

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文件的支撑文件。

4.3 使用.spec文件配置编译

上面讲解的都是通用版本,不太灵活,如果想要加入新的资源,或每次编译不想输入很长的命令,可以使用.spec文件,进行定制化配置编译。

4.3.1 生成.spec文件

使用上面的方式进行编译后,如未指定.spec生成目录,会在当前根目录生成一个与编译py文件同名的.spec文件;

或使用命令pyi-makespec -F start_dian.py,将会直接生成.spec文件;

4.3.2 spec文件内容介绍

打开spec文件

这里仅对涉及到的几个关键变量进行解释:

1.Analysis:
  • 'start_dian.py'\]:是主文件以及全部依赖文件,如果依赖文件都在同一目录下可以不写;

  • datas:添加资源文件,例如文件夹、图片、excel等等,以元组入参,第一个参数为原始路径,第二个参数为编译后的目标路径;
2.EXE:
  • console:是否开启命令行,默认为True(开启);
  • icon:编译出exe可执行文件产物的图标,必须使用绝对路径;
  • name:EXE内和COLLECT内的name都是编译后的文件名,默认与编译主文件同名;
4.3.3 spec文件编译

配置好的spec文件,执行命令进行编译,不再需要其他参数:

pyinstaller start_dian.spec

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

相关推荐
禹凕5 小时前
Python编程——进阶知识(MYSQL引导入门)
开发语言·python·mysql
Victor3565 小时前
MongoDB(2)MongoDB与传统关系型数据库的主要区别是什么?
后端
JaguarJack5 小时前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端·php·服务端
BingoGo5 小时前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端
阿钱真强道5 小时前
13 JetLinks MQTT:网关设备与网关子设备 - 温控设备场景
python·网络协议·harmonyos
Victor3565 小时前
MongoDB(3)什么是文档(Document)?
后端
我的xiaodoujiao5 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 47--设置Selenium以无头模式运行代码
python·学习·selenium·测试工具·pytest
牛奔7 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
寻星探路11 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌12 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp