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.Popenstdinstdoutstderr 参数。
源码修改如下:
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 注意事项相关推荐

  1. pyinstaller打包生成的exe文件(并设置运行时静默)

    pyinstaller打包生成的exe文件(并设置运行时静默) 目录 pyinstaller打包生成的exe文件(并设置运行时静默)

  2. pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行

    pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行 目录 pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行 #pyinstalle ...

  3. Python执行pyinstaller打包生成的exe文件实战

    Python执行pyinstaller打包生成的exe文件实战 目录 Python执行pyinstaller打包生成的exe文件实战 #pyinstaller打包生成的exe文件

  4. pyinstaller打包py文件生成的exe出现闪退问题

    在使用pyinstaller打包py文件生成可执行文件exe出现闪退问题,解决方法: 在需要打包的py文件中的主函数最后一行添加如下代码: python2: raw_input('please inp ...

  5. 解决pyinstaller打包后的exe文件打开闪退的问题

    解决pyinstaller打包后的exe文件打开闪退的问题 闪退问题:一般我们打包完后的exe文件点击运行就会直接闪退,很难看到具体错误 解决步骤: 首先打开 cmd 进入到 exe 文件所在目录(c ...

  6. Pyinstaller打包后的exe文件打开闪退解决方案

    Pyinstaller打包后的exe文件打开闪退解决方案 问题:利用pyinstaller对python代码打包后,dist文件夹中会生成一个xxx.exe可执行文件.但是很多朋友双击这个exe文件会 ...

  7. pyinstaller打包pyqt文件(转)

    pyinstaller打包pyqt文件 https://www.cnblogs.com/dcb3688/p/4211390.html 打包pyqt文件 如何将pyqt生成exe的二进制文件呢,pyin ...

  8. Pyinstaller打包python文件太大?教你三个小技巧有效减小文件体积

    简介 有时候需要在未安装Python环境的平台上运行py程序,使用pyinstaller打包很方便,但打包后的可执行文件实在是太大了.原因在于打包时pyinstaller本就已经关联了很多的pytho ...

  9. pyinstaller 打包py文件 以及字体、图片等资源的引用

    文章目录 1. 改变控制台的编码格式为utf-8 ,在控制台中输入 2. 一般打包可用 pyinstaller -F -i abc.ico xxx.py --noconsole 3. 参数如下: 4. ...

最新文章

  1. 【第13周复盘】小朋友们也开始卷了
  2. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏
  3. Rails插件:CanCan权限验证插件学习总结
  4. zabbix 监控CDN带宽
  5. 领扣-191 位1的个数 Number of 1 Bits MD
  6. Oracle入门(十五)之数据库锁
  7. centos下升级jdk版本
  8. 一句话证明你是产品经理
  9. 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
  10. 计算机公式与函数乘法,excel常用函数乘法公式的使用方法
  11. xpath-了解xpath语言-下载xpath_helper工具
  12. OSPF——优化技术(含配置)
  13. 【1】SCN-Eureka服务注册中心
  14. poj3254(状压dp入门第一道题,很详细)
  15. POJ3494Largest Submatrix of All 1’s[单调栈]
  16. openssl_sign(): supplied key param cannot be coerced into a private key
  17. 图片验证码的逻辑实现
  18. Vue实现excel文件下载
  19. 计算机 审计追踪功能,第 讲 审计追踪技术与Windows安全审计功能
  20. python背单词小程序_微信小程序仿《乐词》背单词APP源码

热门文章

  1. VirtualBox报错:不能为虚拟电脑XXX打开一个新任务
  2. 关于浏览器账密自动填充
  3. 基于麻雀搜索算法的同步优化特征选择 - 附代码
  4. 每日一词20190308——大地水准面(geoid)
  5. Qt下 汉字转换拼音
  6. 数据外泄保护与国土安全部
  7. Windows API函数 (绘图函数)
  8. 6-3 sdust-Java-模拟主板、USB口、TypeC口、PS2口设备 (20 分)
  9. adobe acrobat pro dc 无法打开PDF_PDF怎么破?你一定不想错过这些软件
  10. 【MATLAB统计分析与应用100例】案例011:matlab读取Excel数据,调用regress函数作一元线性回归分析