首页 > 编程语言 >python将资源打包进exe

python将资源打包进exe

时间:2023-12-12 16:13:59浏览次数:38  
标签:src exe python 路径 打包 path 资源

前言

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

分析

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

步骤

  • 这是我的项目结构
    image

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

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

结语

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

标签:src,exe,python,路径,打包,path,资源
From: https://www.cnblogs.com/xi12/p/17897116.html

相关文章

  • MinGW编译Python至pyd踩坑整理
    注意需要魔法用scoop自动安装配置MinGw需要魔法,不需要手动配置mingwscoopinstallmingw安装Cython,Setuptools第三方库关闭魔法,使用清华源pipinstallsetuptools-ihttps://pypi.tuna.tsinghua.edu.cn/simplepipinstallcython-ihttps://pypi.tuna.tsinghua.edu.cn/s......
  • [-007-]-Python3+Unittest+Selenium Web UI自动化测试之@property装饰器默认值设置
    看示例:#!/usr/bin/python3#coding:utf-8__author__='csjin'#定义@property装饰器classPPTListModels(object):def__init__(self):self._tab_name="PPT模板"@propertydefhandle(self):returnself.__handle......
  • The Zen of Python
    TheZenofPythonTheZenofPython,byTimPetersBeautifulisbetterthanugly.Explicitisbetterthanimplicit.Simpleisbetterthancomplex.Complexisbetterthancomplicated.Flatisbetterthannested.Sparseisbetterthandense.Readabilitycou......
  • shell脚本模板-从git拉取代码并打包部署
    source/etc/profile.~/.bash_profile#拉取能耗后端代码cd/usr/local/testmvncleanecho-e"从git华为云拉取后端代码"#首次clonegitpulltest.gitecho-e"从git华为云代码拉取完成"#工程打包echo-e"开始打jar包"mvnpackage-Dmaven.test.skip=true#删除原来的jar包rm......
  • CentOS7.6安装python3.6.8一把成
    yum-yinstallvimunzipnet-tools&&yum-yinstallwget&&yum-yinstallbzip2&&yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-devel......
  • 【python基础之装饰器】---装饰器
    title:【python基础之装饰器】---装饰器date:2023-12-1118:54:06updated:2023-12-1214:30:00description:cover:https://home.cnblogs.com/u/dream-ze/【一】什么是装饰器装饰代指为被装饰对象添加新的功能,器代指器具/工具,装饰器与被装饰的对象均可......
  • 【python基础之函数对象和闭包】 --- 函数对象与闭包
    title:【python基础之函数对象和闭包】---函数对象与闭包date:2023-12-1119:20:00updated:2023-12-1119:20:00description:cover:https://home.cnblogs.com/u/dream-ze/【一】函数对象函数对象指的是函数可以被当做数据来处理具体可以分为四......
  • Python网络连接request报错:OSError: [Errno 113] No route to host
    报错:(pytorch)devil@Monster:~$huggingface-clilogin_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|......
  • python 统一图片尺寸
     ......
  • Python分享之Python的内存管理
    语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语言为例子,说明一门动态类型的、面向对象的语言的内存管理方式。对象的内存使用赋值语句是语言最常见的功能了。但即使是最......