桌面应用打包: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文件比较好:
- 当您需要将资源文件与exe文件捆绑在一起时;
- 当您的依赖文件包括.dll或.so文件时;
- 当您运行exe需要运行参数时;
- 当您需要合并多程序包成为通用模块时;
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
桌面应用打包:pyinstaller的更多相关文章
- 打包pyinstaller
安装:pip3 install pyinstaller 了解几个常用命令 参数 用处 -F 将程序打包成一个文件 -w 去除黑框 -i 添加程序图标 我们将需要打包的test.py文件放到桌面上,之后 ...
- java桌面程序打包教程
首先打包成j可执行的jar文件. . 接下来找到自己生成jar文件的路径就可以看到jar文件了,我的是在桌面: 在桌面新建一个文件夹(名字随便取,一般去项目名字) 上面是我取的文件夹名字,然后把资料文 ...
- Electron 桌面应用打包(npm run build)简述(windows + mac)
最近一段时间在用electron+vue做内部项目的一键构建发布系统的桌面应用,现就其中打包流程写个备注,以示记录. Windows环境打包:1.首先贴一下package.json. { " ...
- Electron桌面应用打包流程
一. 准备工作 1.npm的安装需要下载node.js,安装完node.js之后npm自然会有. 参考链接:http://www.runoob.com/nodejs/nodejs-install-se ...
- Python打包—Pyinstaller
2018-09-27 21:12:05 一 前言 在windows平台学习python的过程中,你肯定会遇到需要把.py脚本打包成.exe的情形,如此,至少有两方面的好处:第一,你的代码保密性更好 ...
- electron安装+运行+打包成桌面应用+打包成安装文件+开机自启动
1.初始化node项目,生成package.json文件 npm init 2.安装electron,并保存为开发依赖项 npm install electron -D 3.根目录下新建index.j ...
- python打包--pyinstaller打包报错
先来一段报错信息 目前打包主要涉及socket模块出现的报错 missing module named resource - imported by posix, C:\Users\Administ ...
- Python程序打包—pyinstaller
简介:PyInstaller是一个十分有用的第三方库,通过对源文件打包,Python程序可以在没有安装 Python的环境中运行,也可以作为一个独立文件方便传递和管理. PyInstaller的官方网 ...
- Python打包-Pyinstaller
我们知道,Python很优雅,很值得学习.但是Python是解释性语言,代码需要有Python解释器才能执行,相比较我们平时直接运行exe等可执行文件多了一步的麻烦. 于是,希望能将Python程序打 ...
- java桌面项目打包_by icewee_写得太棒了,直接转载了
前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...
随机推荐
- Rsync文件同步及备份
Rsync文件同步及备份 目录 Rsync文件同步及备份 Rsync基本概述 远程文件传输 服务端口 Rsync的三种传输模式 本地方式(类似cp) 远程方式(类似scp) 守护进程(C/S结构) R ...
- PBN衔接ILS时中间进近航段的保护区绘制方法
收到网友提问,PBN程序和ILS程序在衔接时,中间进近航段的保护区该怎么去绘制. 这个问题怎么看呢?首先起始进近航段与中间进近航段存在两种连接方式,一种是直线进近.另一种是转弯进近,两者的保护区是显著 ...
- 2022-07-12:以下go语言代码输出什么?A:1 1;B:1.0 1.0;C:编译不通过;D:1.0 1。 package main import “fmt“ func main() {
2022-07-12:以下go语言代码输出什么?A:1 1:B:1.0 1.0:C:编译不通过:D:1.0 1. package main import "fmt" func ma ...
- 2022-03-29:整个二维平面算是一张地图,给定[x,y],表示你站在x行y列, 你可以选择面朝的任何方向, 给定一个正数值angle,表示你视野的角度为, 这个角度内你可以看无穷远,这个角度外你
2022-03-29:整个二维平面算是一张地图,给定[x,y],表示你站在x行y列, 你可以选择面朝的任何方向, 给定一个正数值angle,表示你视野的角度为, 这个角度内你可以看无穷远,这个角度外你 ...
- Selenium - 元素定位(2) - XPATH进阶
Selenium - 元素定位 XPATH 定位进阶 元素示例 属性定位 # xpath 通过id属性定位 driver.find_element_by_xpath("//*[@id='kw ...
- 用Linux命令操作mysql数据库
操作mysql数据库,相信大家最熟悉的应该是用navicat工具来新建数据库,建表,查询数据,查看表结构等. 但是如果数据库与本操作机器不在同一个局域网内,并且对方环境也不支持vpn的情况下,如何查询 ...
- Python异步编程之web框架异步vs同步 无IO任务压测对比
前言 在python编程中,通过协程实现的异步编程号称能够提高IO密集型任务的并发量.本系列比较web服务器同步框架和异步框架的性能差异,包括无IO接口和常见IO操作,如文件.mysql.redis等 ...
- 慢 SQL 优化之索引的作用是什么?
前言 本文针对 MySQL 数据库的 InnoDB 存储引擎,介绍其中索引的实现以及索引在慢 SQL 优化中的作用. 本文主要讨论不同场景下索引生效与失效的原因. 慢SQL与索引的关系 慢SQL优化原 ...
- Redis系列15:使用Stream实现消息队列(精讲)
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- WPF中实现含有中心点Slider双向滑动条
想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...