鱼C论坛

 找回密码
 立即注册
查看: 3858|回复: 5

pyinstaller 打包文件资源问题,请大佬们指教

[复制链接]
发表于 2019-11-7 18:58:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问各位大神;
pyinstaller 打包exe文件后,
执行程序easygui界面图片不显示怎么解决?

                               
登录/注册后可看大图


在是py文件的时候还能正常执行。
打包命令[pyinstaller -F -w -i logo.ico Delete.py]
在.spec文件中已加入图片路径。


                               
登录/注册后可看大图

打包期间无报错。
打包后必须把图片放到exe同目录下才能正常显示。
我想的是把资源文件一起打包进exe文件中。

在咱论坛看到有位老哥遇到跟我类似的问题:回复是无法将资源文件打包进exe。
疑问 如果无法打包进exe 那pyinstaller 的
  1. --add-data <SRC;DEST or SRC:DEST>
复制代码

命令是起到什么作用呢?
以及.spec文件里面的datas指定文件的路径的作用是什么呢?

网络上查过方法,没有解决。

python版本 3.7
win10 64
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-7 23:41:01 | 显示全部楼层
参考
https://blog.csdn.net/jayden_gu/article/details/94134409
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-8 02:36:57 | 显示全部楼层
ba21 发表于 2019-11-7 23:41
参考
https://blog.csdn.net/jayden_gu/article/details/94134409

你好,我的步骤根据你发出的链接里面教程试过,依旧会报错。
参照官方文档的方法也试过,依旧无图。
错误信息:
  1. Image file ad2.gif does not exist.
复制代码


ad2.gif是我要显示的图片名称。
资源文件与.py文件在同一目录下面。

py文件中对其引用的相关代码是:
  1. import easygui as eg
复制代码
  1. eg.msgbox("你好", "温馨提示", image="ad2.gif")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-8 15:35:40 | 显示全部楼层
抓只小甲鱼炖汤 发表于 2019-11-8 02:36
你好,我的步骤根据你发出的链接里面教程试过,依旧会报错。
参照官方文档的方法也试过,依旧无图。
错 ...

那就上代码啊!~你图方便传个图,我还闲懒的敲代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-9 02:21:36 | 显示全部楼层
ba21 发表于 2019-11-8 15:35
那就上代码啊!~你图方便传个图,我还闲懒的敲代码。

项目目录

                               
登录/注册后可看大图


.py主文件代码
  1. # -*- coding: utf-8 -*-
  2. # author: star time: 2019/11/1

  3. import easygui as eg

  4. #进入页面弹窗
  5. eg.msgbox("hellowindows","tips",image="ad2.gif")
复制代码


输入生成spec文件指令

  1. pyi-makespec -F Delete.py
复制代码


输入指令后Terminal显示的信息
  1. wrote G:\Auto_delete\Delete.spec
  2. now run pyinstaller.py to build the executable
复制代码


修改生成的spec文件中
  1. datas=[]
复制代码
的内容为
  1. datas=[('./ad2.gif','.')]
复制代码

  1. # -*- mode: python ; coding: utf-8 -*-

  2. block_cipher = None


  3. a = Analysis(['Delete.py'],
  4.              pathex=['G:\\Auto_delete'],
  5.              binaries=[],
  6.              datas=[('./ad2.gif','.')],
  7.              hiddenimports=[],
  8.              hookspath=[],
  9.              runtime_hooks=[],
  10.              excludes=[],
  11.              win_no_prefer_redirects=False,
  12.              win_private_assemblies=False,
  13.              cipher=block_cipher,
  14.              noarchive=False)
  15. pyz = PYZ(a.pure, a.zipped_data,
  16.              cipher=block_cipher)
  17. exe = EXE(pyz,
  18.           a.scripts,
  19.           a.binaries,
  20.           a.zipfiles,
  21.           a.datas,
  22.           [],
  23.           name='Delete',
  24.           debug=False,
  25.           bootloader_ignore_signals=False,
  26.           strip=False,
  27.           upx=True,
  28.           upx_exclude=[],
  29.           runtime_tmpdir=None,
  30.           console=True )
复制代码


输入生成exe文件指令
  1. pyinstaller Delete.spec
复制代码


输入指令后Terminal显示的信息
  1. 88 INFO: PyInstaller: 3.5
  2. 88 INFO: Python: 3.7.4
  3. 88 INFO: Platform: Windows-10-10.0.18362-SP0
  4. 90 INFO: UPX is not available.
  5. 359 INFO: Extending PYTHONPATH with paths
  6. ['G:\\Auto_delete', 'G:\\Auto_delete']
  7. 359 INFO: checking Analysis
  8. 359 INFO: Building Analysis because Analysis-00.toc is non existent
  9. 359 INFO: Initializing module dependency graph...
  10. 365 INFO: Initializing module graph hooks...
  11. 367 INFO: Analyzing base_library.zip ...
  12. 4032 INFO: running Analysis Analysis-00.toc
  13. 4035 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  14.   required by c:\users\星缘\appdata\local\programs\python\python37\python.exe
  15. 4254 INFO: Caching module hooks...
  16. 4260 INFO: Analyzing Delete.py
  17. 4567 INFO: Loading module hooks...
  18. 4567 INFO: Loading module hook "hook-encodings.py"...
  19. 4635 INFO: Loading module hook "hook-pydoc.py"...
  20. 4636 INFO: Loading module hook "hook-xml.py"...
  21. 4888 INFO: Loading module hook "hook-_tkinter.py"...
  22. 4989 INFO: checking Tree
  23. 4990 INFO: Building Tree because Tree-00.toc is non existent
  24. 4990 INFO: Building Tree Tree-00.toc
  25. 5036 INFO: checking Tree
  26. 5036 INFO: Building Tree because Tree-01.toc is non existent
  27. 5036 INFO: Building Tree Tree-01.toc
  28. 5065 INFO: checking Tree
  29. 5065 INFO: Building Tree because Tree-02.toc is non existent
  30. 5065 INFO: Building Tree Tree-02.toc
  31. 5069 INFO: Looking for ctypes DLLs
  32. 5069 INFO: Analyzing run-time hooks ...
  33. 5071 INFO: Including run-time hook 'pyi_rth__tkinter.py'
  34. 5079 INFO: Looking for dynamic libraries
  35. 5208 INFO: Looking for eggs
  36. 5208 INFO: Using Python library c:\users\星缘\appdata\local\programs\python\python37\python37.dll
  37. 5208 INFO: Found binding redirects:
  38. []
  39. 5212 INFO: Warnings written to G:\Auto_delete\build\Delete\warn-Delete.txt
  40. 5240 INFO: Graph cross-reference written to G:\Auto_delete\build\Delete\xref-Delete.html
  41. 5268 INFO: Appending 'datas' from .spec
  42. 5273 INFO: checking PYZ
  43. 5273 INFO: Building PYZ because PYZ-00.toc is non existent
  44. 5273 INFO: Building PYZ (ZlibArchive) G:\Auto_delete\build\Delete\PYZ-00.pyz
  45. 5620 INFO: Building PYZ (ZlibArchive) G:\Auto_delete\build\Delete\PYZ-00.pyz completed successfully.
  46. 5632 INFO: checking PKG
  47. 5632 INFO: Building PKG because PKG-00.toc is non existent
  48. 5632 INFO: Building PKG (CArchive) PKG-00.pkg
  49. 7713 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
  50. 7739 INFO: Bootloader c:\users\星缘\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\b
  51. ootloader\Windows-64bit\run.exe
  52. 7739 INFO: checking EXE
  53. 7740 INFO: Building EXE because EXE-00.toc is non existent
  54. 7740 INFO: Building EXE from EXE-00.toc
  55. 7740 INFO: Appending archive to EXE G:\Auto_delete\dist\Delete.exe
  56. 7750 INFO: Building EXE from EXE-00.toc completed successfully.
复制代码


运行打包出来的exe文件dos窗口显示的报错信息
  1. Image file ad2.gif does not exist.
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-9 21:48:29 | 显示全部楼层

1、首先说下我对pyinstaller 生成exe的理解
pyinstaller生成exe就好比平常使用Winrar压缩解压软件一样,把需要的文件都压缩到1个文件里;在运行的时候再把这些文件释放出来。

2、像你这代码中easygui加载图片;easygui只能加载gif图片,且只能指定路径(相对路径/绝对路径)它并不能使用二进制流来加载

3、跟据以上2点,所以只能变相的把gif图片打包进exe,然后待exe解压后然后获取到.py脚本释放后的路径,此时便可得之gif图片的路径。(当然获取该路径需要相关的代码实现)

https://blog.csdn.net/jayden_gu/article/details/94134409 此文并没有公布runWindow.py 代码,所以导致讲得不清不楚。

参考我这正确的做法:

文件结构
2019119_214220.png    2019119_214234.png

assetinfo.py
  1. import os
  2. import sys


  3. def resource_path(relative_path):
  4.     if getattr(sys, 'frozen', False):  # 是否Bundle Resource
  5.         base_path = sys._MEIPASS
  6.     else:
  7.         #base_path = os.path.abspath(".")
  8.         base_path = os.path.dirname(os.path.abspath(__file__))
  9.     return os.path.join(base_path, relative_path)

  10. winGif_path = resource_path(os.path.join("ad2.gif"))

  11. class messageInfor:
  12.     def __init__(self):
  13.         pass
  14.     about_infor = "当前版本: v 1.0.0"
  15.     windowGif = winGif_path
复制代码


test.py
  1. import easygui as eg
  2. import assets.assetinfo as ai

  3. messageInfor = ai.messageInfor()
  4. windowGif = messageInfor.windowGif

  5. #进入页面弹窗
  6. eg.msgbox("hellowindows","tips",image = windowGif)

复制代码



执行
pyinstaller -F test.py

删除
build和dist两个文件

修改 test.spec 为
2019119_214723.png

执行
pyinstaller -F test.spec



完成


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-20 15:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表