当前位置:主页 > python > python将资源打包进exe

python将资源打包进exe

xi5个月前 (12-12)python7940

前言

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

分析

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

步骤

  • 这是我的项目结构

    图片资源在src下的img目录中,我在main.py中需要使用其中的图片。
  • 在main.py中定义动态获取资源路径的函数
    #获取资源路径
    def getPath(relative_path):
      # 判断是否为frozen状态(即为打包运行状态)
      if getattr(sys, 'frozen', False):
          base_path = sys._MEIPASS
      else:
          base_path = os.path.abspath(".")
      return os.path.join(base_path, relative_path)# 返回真实路径
    我们需要先获取项目当前状态,判断是否为frozen状态(即为打包运行状态),是的话先获取 MEIPASS路径(MEIPASS为双击exe时系统分配的临时工作目录),不是的话直接获取绝对路径,最后返回真实路径。
  • 在需要获取路径的地方直接使用getPath即可,比如我要修改exe窗体图标,这样即可:
    root.iconbitmap(getPath(os.path.join("src","img/logo.ico")))
    我要在tk界面使用Label添加图片,这样即可:
    imgImg = ImageTk.PhotoImage(Image.open(getPath(os.path.join("src","img/img.png"))))
    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

“python将资源打包进exe” 的相关文章

python项目生成exe

python项目生成exe

前言做了个python的小项目,需要打包为桌面端的exe使用,结果一打包,体积直接上百兆了,研究了下,使用虚拟环境打出的包会更干净小巧。 安装anaconda anaconda用作python的虚...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。