写点什么

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

  • 2023-08-08
    北京
  • 本文字数:1897 字

    阅读完需:约 6 分钟

桌面应用打包: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’]:是主文件以及全部依赖文件,如果依赖文件都在同一目录下可以不写;

  • oathex:项目的绝对路径;

  • 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

发布于: 刚刚阅读数: 3
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
桌面应用打包:pyinstaller | 京东物流技术团队_Python_京东科技开发者_InfoQ写作社区