翼度科技»论坛 编程开发 python 查看内容

python将资源打包进exe

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
前言

之前py打包的exe一直是不涉及图片等资源的,直到我引入图片后打包,再双击exe发现直接提示未找到资源。
分析

我py代码中的图片引入使用的是项目相对路径,打包时pyinstaller只会引入py模块,这种路径引入的资源其实是不会打包进exe的。有人想的是可以直接将资源放到exe旁边,但这不是最优雅的方法,你发布exe还得给人家一堆相关资源文件,其实想要解决此类无法打包资源的问题其实只需要做两件事:1、修改spec打包配置。2、动态获取资源路径。
步骤


  • 这是我的项目结构

图片资源在src下的img目录中,我在main.py中需要使用其中的图片。


  • 在main.py中定义动态获取资源路径的函数
  1. #获取资源路径
  2. def getPath(relative_path):
  3.     # 判断是否为frozen状态(即为打包运行状态)
  4.     if getattr(sys, 'frozen', False):
  5.         base_path = sys._MEIPASS
  6.     else:
  7.         base_path = os.path.abspath(".")
  8.     return os.path.join(base_path, relative_path)# 返回真实路径
复制代码
我们需要先获取项目当前状态,判断是否为frozen状态(即为打包运行状态),是的话先获取     MEIPASS路径(MEIPASS为双击exe时系统分配的临时工作目录),不是的话直接获取绝对路径,最后返回真实路径。

  • 在需要获取路径的地方直接使用getPath即可,比如我要修改exe窗体图标,这样即可:
  1. root.iconbitmap(getPath(os.path.join("src","img/logo.ico")))
复制代码
我要在tk界面使用Label添加图片,这样即可:
  1. imgImg = ImageTk.PhotoImage(Image.open(getPath(os.path.join("src","img/img.png"))))
  2. Label(imgFrame,image=imgImg).grid(column = 0,row = 0)
复制代码

  • 最后修改spec打包配置(不懂spec的看这儿:https://xiblogs.top/?id=57 )中Analysis的datas:

    datas中第一个src表示你需要打包的资源目录,第二个src表示打包成exe后双击exe时释放资源在MEIPASS目录下的具体位置,这是我打包运行时系统释放资源的位置,你可以看到src就在这里,exe中的图片也加载进界面了:

结语

值得注意的是该目录打开exe即生成,关闭exe即删除,不可在此长久保存文件。类似于我篇文章(https://xiblogs.top/?id=65 )修改exe图标使用base64转换ico的逻辑,当然,你现在可以直接使用MEIPASS来处理了。
原文链接:https://xiblogs.top/?id=66

来源:https://www.cnblogs.com/xi12/p/17897116.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

举报 回复 使用道具