PyInstaller 打包单文件 exe 注意事项
PyInstaller
打包单文件 exe
注意事项
- PyInstaller 打包单文件 exe 注意事项
- 0. 官网
- 1. PyInstaller 打包单文件 exe 时遇到的问题
- 2. 找不到 PyQt5.sip 的解决方案
- 3. 找不到窗体小图标的解决方案
- 4. 找不到 ffprobe.exe 的解决方案
- 5. 使用 subprocess.Popen 无法调用外部程序的解决方案
0. 官网
- 官方网站
http://www.pyinstaller.org/ - 官方手册
https://pyinstaller.readthedocs.io/en/v3.3.1/
1. PyInstaller
打包单文件 exe
时遇到的问题
我写了一个 Python
小脚本,用来统计当前目录及其子目录下所有视频文件个数与时长,其中用到了 subprocess.Popen
调用了外部 exe
文件 ffprobe.exe
,另外使用 PyQt5
创建了一个简单的小窗体,在窗体标题显示程序图标,源码执行效果如下:
然而在用 PyInstaller
打包成单文件 exe
的时候先后遇到了以下四个问题:
- 找不到
PyQt5.sip
- 找不到窗体小图标
- 找不到
ffprobe.exe
- 脚本正常运行,调用
ffprobe.exe
出错
以下是针对各个问题的解决方案,其中一些问题有多个解决方案,这里仅提供一种,仅供参考。
2. 找不到 PyQt5.sip
的解决方案
这个问题应该是 PyInstaller
没有导入该模块导致的,在源代码中显式导入即可:
from PyQt5 import sip
参考网址:https://blog.csdn.net/yueguangmanong/article/details/81139224
3. 找不到窗体小图标的解决方案
找不到窗体小图标的原因是,单文件打包的时候, PyInstaller
改变了资源存储路径,用原来的相对路径引用不到。
所以首先在源代码中加入 resource_path
函数,该函数返回资源的绝对路径:
def resource_path(relative_path):'''返回资源绝对路径。'''if hasattr(sys, '_MEIPASS'):# PyInstaller会创建临时文件夹temp# 并把路径存储在_MEIPASS中base_path = sys._MEIPASSelse:base_path = os.path.abspath('.')return os.path.join(base_path, relative_path)
然后把所有对资源相对路径的引用传入 resource_path
函数即可,比如:
self.setWindowIcon(QIcon(resource_path(r'img\电影.png')))
最后一步,在使用 pyinstaller
命令生成 exe
的时候要使用 --add-data
选项加入所有资源文件。
在 Windows
下该选项的格式为 --add-data="源地址;目标地址"
,可多次重复使用。
其他系统的命令格式需要把地址分隔符从分号 ;
改成冒号 :
,详见官方手册。
pyinstaller --add-data="img\电影.png;img" --add-data="ffprobe.exe;." -i="img\电影.ico" -Fw movielen.py
4. 找不到 ffprobe.exe
的解决方案
该问题的产生原因,跟找不到窗体小图标是一样的,所以解决方案也一样。
同样注意,最后使用 pyinstaller
命令的时候需要用 --add-data
选项把 ffprobe.exe
添加进去。
另外,还可以通过编写 spec
配置文件来做到这一点,具体使用方法请查阅官方手册。
5. 使用 subprocess.Popen
无法调用外部程序的解决方案
在我的脚本中,通过 subprocess.Popen
来调用了外部可执行文件 ffprobe.exe
,但是打包成单文件 exe
就运行失败。
原因在于,我在打包过程中使用了 -w
选项,即无控制台模式,这时就需要修改源码,显式指定 subprocess.Popen
的 stdin
、 stdout
和 stderr
参数。
源码修改如下:
sp = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True)
最终使用以下命令,成功打包了单文件 exe
(无控制台模式),并且拥有自己的图标,图片资源完美显示,可以封装并调用别的 exe
文件。
pyinstaller --add-data="img\电影.png;img" --add-data="ffprobe.exe;." -i="img\电影.ico" -Fw movielen.py
最终效果如下:
参考网址:
https://github.com/pyinstaller/pyinstaller/issues/1339
PyInstaller 打包单文件 exe 注意事项相关推荐
- pyinstaller打包生成的exe文件(并设置运行时静默)
pyinstaller打包生成的exe文件(并设置运行时静默) 目录 pyinstaller打包生成的exe文件(并设置运行时静默)
- pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行
pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行 目录 pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行 #pyinstalle ...
- Python执行pyinstaller打包生成的exe文件实战
Python执行pyinstaller打包生成的exe文件实战 目录 Python执行pyinstaller打包生成的exe文件实战 #pyinstaller打包生成的exe文件
- pyinstaller打包py文件生成的exe出现闪退问题
在使用pyinstaller打包py文件生成可执行文件exe出现闪退问题,解决方法: 在需要打包的py文件中的主函数最后一行添加如下代码: python2: raw_input('please inp ...
- 解决pyinstaller打包后的exe文件打开闪退的问题
解决pyinstaller打包后的exe文件打开闪退的问题 闪退问题:一般我们打包完后的exe文件点击运行就会直接闪退,很难看到具体错误 解决步骤: 首先打开 cmd 进入到 exe 文件所在目录(c ...
- Pyinstaller打包后的exe文件打开闪退解决方案
Pyinstaller打包后的exe文件打开闪退解决方案 问题:利用pyinstaller对python代码打包后,dist文件夹中会生成一个xxx.exe可执行文件.但是很多朋友双击这个exe文件会 ...
- pyinstaller打包pyqt文件(转)
pyinstaller打包pyqt文件 https://www.cnblogs.com/dcb3688/p/4211390.html 打包pyqt文件 如何将pyqt生成exe的二进制文件呢,pyin ...
- Pyinstaller打包python文件太大?教你三个小技巧有效减小文件体积
简介 有时候需要在未安装Python环境的平台上运行py程序,使用pyinstaller打包很方便,但打包后的可执行文件实在是太大了.原因在于打包时pyinstaller本就已经关联了很多的pytho ...
- pyinstaller 打包py文件 以及字体、图片等资源的引用
文章目录 1. 改变控制台的编码格式为utf-8 ,在控制台中输入 2. 一般打包可用 pyinstaller -F -i abc.ico xxx.py --noconsole 3. 参数如下: 4. ...
最新文章
- 【第13周复盘】小朋友们也开始卷了
- Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏
- Rails插件:CanCan权限验证插件学习总结
- zabbix 监控CDN带宽
- 领扣-191 位1的个数 Number of 1 Bits MD
- Oracle入门(十五)之数据库锁
- centos下升级jdk版本
- 一句话证明你是产品经理
- 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
- 计算机公式与函数乘法,excel常用函数乘法公式的使用方法
- xpath-了解xpath语言-下载xpath_helper工具
- OSPF——优化技术(含配置)
- 【1】SCN-Eureka服务注册中心
- poj3254(状压dp入门第一道题,很详细)
- POJ3494Largest Submatrix of All 1’s[单调栈]
- openssl_sign(): supplied key param cannot be coerced into a private key
- 图片验证码的逻辑实现
- Vue实现excel文件下载
- 计算机 审计追踪功能,第 讲 审计追踪技术与Windows安全审计功能
- python背单词小程序_微信小程序仿《乐词》背单词APP源码
热门文章
- VirtualBox报错:不能为虚拟电脑XXX打开一个新任务
- 关于浏览器账密自动填充
- 基于麻雀搜索算法的同步优化特征选择 - 附代码
- 每日一词20190308——大地水准面(geoid)
- Qt下 汉字转换拼音
- 数据外泄保护与国土安全部
- Windows API函数 (绘图函数)
- 6-3 sdust-Java-模拟主板、USB口、TypeC口、PS2口设备 (20 分)
- adobe acrobat pro dc 无法打开PDF_PDF怎么破?你一定不想错过这些软件
- 【MATLAB统计分析与应用100例】案例011:matlab读取Excel数据,调用regress函数作一元线性回归分析