pyinstaller使用大全
作者:yinchao163 发布时间:2022-12-17 21:37:28
背景
在python工程完成开发以后需要编译成可执行文件,如此一来生产环境和开发环境隔离开来便于用户使用(可独立使用,无需配置python开发环境),pyinstaller可以方便地将脚本编译成exe
1. pyinstaller的安装
pip install pyinstaller
2. pyinstaller工作原理
先生成一个spec文件(手动或自动均可),该文件决定了实际编译规则
再自动生成一个build文件夹,所有自动编译的中间产物都放在其中
最后生成dist文件夹,存放编译输出
3. pyinstaller打包成exe
3.1 最简单(单个文件):
pyinstaller xxx.py
一般搞法(多文件)
先自动生成spec文件:
pyi-makespec xxx.py
再根据自己的实际需求手动修改spec文件
最后统一installer:
pyinstaller xxx.spec
F 生成一个单一可执行文件【常用】
w 禁止弹出控制台【常用】
i 修改exe生成的图标【常用】
h 打印帮助信息
v 打印版本信息
d 生成带各种依赖的文件夹,包含exe,dll,以及其他文件
p 指定搜索路径
3.3 spec文件解析
Analysis:
['Console.py','xxx.py'...] <- 此处列出的脚本生成exe后会按顺序依次执行!
pathex <- 此处为搜索路径
binaries <- 非python的库文件
datas <- ini文件,字体,图片,icon什么的
pure <- python模块
PYZ: <- 不用管
EXE: <- 输出配置
COLLECT: <- 不用管
3.4 打包dll
在生成的spec文件中修改datas字段,形如:
3.5 利用upx压缩exe
UPX下载地址
运行命令: pyinstaller xxx.spec --upx [输出路径]
4. 常见问题
4.1 打包后的文件太大了
方法1 —— 虚拟环境下打包
造成打包文件太大的主要原因是打包了太多不必要的库,比如安装了anaconda。或者自己pip install了太多库。显然要想解决该问题核心就是不要打包那么多的库。
最好的办法是:在一个虚拟环境中单独打包,只打包该程序执行所必备的依赖库
具体操作方法是:
先安装 pipenv工具,在该工具的帮助下创建虚拟环境单独打包
pip install pipenv
进入虚拟环境:
pipenv shell
尝试运行一下应用程序,缺什么包就单独pip install安装什么包
python xxx.py
当前面的应用程序都可以用的时候再安装pyinstaller,然后进行打包即可
pip install pyinstaller ,pyinstaller -Fw xxx.py
退出虚拟环境
exit
关于pipenv更详细使用请参阅
方法2 —— 排除不相干的包
在*.spec的excludes栏目中添加对应的, 常见: excludes=['matplotlib', 'pandas', 'scipy']
,
也可以通过命令行排除: pyinstaller.exe --exclude xxx_package yyy.py
4.2 明明python xxx.py能正常使用, 而打包成exe却无法使用了
主要有以下几种现象:
编译后的exe在打包的机器上运行良好,放到别人机器上不能用了。
python xxx.py能正常使用, 而打包成exe却无法使用了。
目前所知主要是两个方面的原因:
路径问题。
依赖包的问题。
python脚本执行的默认路径和exe打包后的路径是不一样的,如果软件中存在文件读取等操作,很有可能导致exe找不到资源而运行出错。
解决该问题的方法是路径冻结
#frozen_dir.py
import os,sys
def app_path():
if hasattr(sys, 'frozen'):
return os.path.dirname(sys.executable)
return os.path.dirname(__file__)
添加frozen_dir.py后,app_path会生成一个绝对准确的基地址,所有的路径以此为基准,如下所示:
import frozen_dir
SETUP_DIR = frozen_dir.app_path()
依赖包的问题往往出现在:在一开始就pyinstaller打包过程序,后续开发时又安装了新模块,如此一来python xxx.py可以正常执行脚本,但是运行xxx.exe报错。
错误根源可能是:pyinstaller是不会更新__pycache__文件夹的,所以后面增加的模块它不知道,也不会打包进去的:
解决方法非常简单:把打包中生成的资源全部删除【__ pycache __, build, dist】,然后重新打包即可
4.3 打包后exe执行速度太慢了啊
解决方法1:精简代码,删除不必要的内容
解决方法2: 用-D -w 打包,缺点是文件太多
pyinstaller -D -w -i icon.ico XX.py
FAQ A: -F打包成的exe可以用,带上-w参数去掉console框就不能用了
Q:暂未解决(跟源码中需要获取cmd执行输出有关)
A:-i增加自定义icon功能后,目录下不含icon资源exe执行异常
Q:暂未解决
A: No module named pkg_resources
Q: 有可能是setuptools版本太高所致(请参考文末扩展知识),pip install setuptools==44.0.0
即可
A:failed to execute pyi_rth_pkgres
Q: 有可能是pyinstaller的版本问题,卸载重新安装一下,参考:
扩展:
Pyinstaller No module named pkg_resources.py2_warn
我通过降低setuptools版本到 44.0.0 后成功解决问题。
pip install setuptools==44.0.0
参考链接
pyinstaller踩坑指南
pyinstaller使用详细教程
pyinstaller官网手册
spec修改示例
py,pyc,pyo,pyd的讲解,不同需求不同打包策略
Pyinstaller打包附带DLL、图标和压缩EXE方法
来源:https://blog.csdn.net/yinchao163/article/details/127352614


猜你喜欢
- 如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录。下面我们
- 1、构建合理的HTTP请求标头。HTTP的请求头是一组属性和配置信息,当您发送一个请求到网络服务器时。因为浏览器和Python爬虫发送的请求
- 经常使用python检测服务器是否能ping通, 程序是否正常运行(检测对应的端口是否正常)以前使用shell脚本的写法如下:PINGRET
- 和数据库打交道要频繁地用到SQL语句,除非你是全部用控件绑定的方式,但采用控件绑定的方式存在着灵活性差、效率低、功能弱等等缺点。因此,大多数
- 本文通过实际业务系统中调整的一个案例,试图给出一个常见CPU消耗问题的一个诊断方法.大多数情况下,系统的性能问题都是由不良SQL代码引起的,
- HTTP Request的Header信息1、HTTP请求方式如下表:GET向Web服务器请求一个文件POST向Web服务器发送数据让Web
- vue3 ref构建响应式变量失效问题描述在Vue3中使用ref声明响应式变量,同时用函数对值进行变化,但是无法响应式改变值<temp
- 网上存在这么一个例子 obj = pd.Series([7,-5,7,4,2,0,4])obj.rank()输出为:0 6.51
- 表单验证是WEB开发中经常遇到的问题,我们以前常见的做法是:在客户端对表单域进行内容的检查,看是否是满足一定的要求或满足一定的结构,比如:是
- 1、背景我们先谈谈为什么在Python编码过程中强烈推荐使用类型注解 ?Python对于初学者来说是非常好上手,原因是在于对计算机底层原理的
- 本文实例为大家分享了python绘制直方图的具体代码,供大家参考,具体内容如下用两列数据绘制直方图#coding=gbkimport xlw
- 概述你可能在JavaScript项目中都用了console.log。这是一种查看变量的值或程序运行中发生的事情的便捷方法。但是JavaScr
- 准备工作首先是准备工作,导入需要使用的库,读取并创建数据表取名为loandata。import numpy as npimport pand
- 由于公司经常需要异地办公,在调试的时候需要用到内网环境,因此手动写了个代理转发服务器給兄弟们用:socks5proxy。选型上,语言上就选择
- Limit语法:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetL
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 本文实例讲述了Python使用matplotlib绘制余弦的散点图。分享给大家供大家参考,具体如下:一 代码import numpy as
- sqlalchemy的常用数据类型数据类型python数据类型说明Integerint整形Stringstr字符串Floatfloat浮点型
- 对于php开发小白来说搭建一个php运行环境就是一道坎!因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境
- Python 中有 while 和 for 两种循环机制,其中 while 循环