pyqt:利用临时变量的方式打包资源文件到exe中

利用临时变量的方式打包资源文件到exe中

原理:exe文件运行时候会创建一个_MEIPASS的临时文件,而这个文件中存放的就是利用spec打包进入exe文件的资源文件

比如:我的资源文件是’resource’,主函数是main.py

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

利用spec文件,生成exe文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

那么在运行exe文件的时候,会存在一个_MEIPASS临时文件夹,打包resource进入exe的资源文件会出现在这个临时文件夹下。

所有只要能访问到这个临时文件夹,就可以获取到图片资源

获取临时文件夹中的资源路劲

需要改写代码中的引用的图片路径

# 首先需要一个获取到这个路径的函数

# 首先需要一个获取到这个路径的函数
import sys
import os

#生成资源文件目录访问路径
def resource_path(relative_path):
    if getattr(sys, 'frozen', False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

#访问res文件夹下ConfessionBallon.MP3的内容
filepath = resource_path(os.path.join("res","ConfessionBallon.MP3"))

其次需要改写代码中的资源引用写法

使用spec文件打包

pyinstller main.spec

完成


SPEC内容说明

下图就是对一个main.py进行打包时,默认生成的spec文件,我们来看下每个参数表示的含义
默认Spec文件

变量含义
aAnalysis类的实例,要求传入各种脚本用于分析程序的导入和依赖。a中内容主要包括以下四部分:scripts,即可以在命令行中输入的Python脚本;pure,程序代码文件中的纯Python模块,包括程序的代码文件本身;binaries,程序代码文件中需要的非Python模块,包括–add-binary参数指定的内容;datas,非二进制文件,包括–add-data参数指定的内容。
pyzPYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。
exeEXE类的实例,这个类是用来处理Analysis和PYZ的结果的,也是用来生成最后的exe可执行程序。
collCOLLECT类的实例,用于创建输出目录。在-F模式下,是没有COLLECT实例的,并且所有的脚本、模块和二进制文件都包含在了最终生成的exe文件中。
block_cipher加密密钥

以上内容中 修改比较多的是a、exe的内容,coll和pyz基本没有遇到需要修改的情况。

参数含义
Analysis参数scripts也是第一个参数,它是一个脚本列表,可以传入多个py脚本,效果与命令行中指定多py文件相同,即py文件不止一个时,比如“pyinstaller xxx1.py xxx2.py”,pyinstaller会依次分析并执行,并把第一个py名称作为spec和dist文件下的文件夹和程序的名称
Analysis参数pathex默认有一个spec的目录,当我们的一些模块不在这个路径下,记得把用到的模块的路径添加到这个list变量里。同命令“-p DIR/–paths DIR”.
Analysis参数datas作用是将本地文件打包时拷贝到目标路径下。datas是一个元素为元组的列表,每个元组有两个元素,都必须是字符串类型,元组的第一个元素为数据文件或文件夹,元组的第二个元素为运行时这些文件或文件夹的位置。例如:datas=[(’./src/a.txt’, ‘./dst’)],表示打包时将"./src/a.txt"文件添加(copy)到相对于exe目录下的dst目录中。也可以使用通配符:datas= [ (’/mygame/sfx/*.mp3’, ‘sfx’ ) ],表示将/mygame/sfx/目录下的所有.mp3文件都copy到sfx文件夹中。也可以添加整个文件夹:datas= [ (’/mygame/data’, ‘data’ ) ],表示将/mygame/data文件夹下所有的文件都copy到data文件夹下。同命令“–add-data”。
Analysis参数binaries添加二进制文件,也是一个列表,定义方式与datas参数一样。没具体使用过。同命令“–add-binary”。
Analysis参数hiddenimports指定脚本中需要隐式导入的模块,比如在__import__、imp.find_module()、exec、eval等语句中导入的模块,这些模块PyInstaller是找不到的,需要手动指定导入,这个选项可以使用多次。同命令“–hidden-import MODULENAME/–hiddenimport MODULENAME”。
Analysis参数hookspath指定额外hook文件(可以是py文件)的查找路径,这些文件的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑(并不会改变这些库本身的代码),以便能顺利的打包完成,这个选项可以使用多次。同命令“–additional-hooks-dir HOOKSPATH”。
Analysis参数runtime_hooks指定自定义的运行时hook文件路径(可以是py文件),在打好包的exe程序中,在运行这个exe程序时,指定的hook文件会在所有代码和模块之前运行,包括main文件,以满足一些运行环境的特殊要求,这个选项可以使用多次。同命令“–runtime-hook RUNTIME_HOOKS”。
Analysis参数excludes指定可以被忽略的可选的模块或包,因为某些模块只是PyInstaller根据自身的逻辑去查找的,这些模块对于exe程序本身并没有用到,但是在日志中还是会提示“module not found”,这种日志可以不用管,或者使用这个参数选项来指定不用导入,这个选项可以使用多次。同命令“–exclude-module EXCLUDES”。
exe参数console设置是否显示命令行窗口,同命令-w/-c。
exe参数icon设置程序图标,默认spec是没有的,需要手动添加,参数值就是图片路径的字符串。同命令“命令-i/–icon”。

存在的一个坑

得到资源文件在temp中的绝对地址之后,用这个文件的方式有两种

直接给某个函数方法等使用:

此时可以直接使用

给stylesheet使用:

因为python的路径分割符号和win的分割符号是不相同的,所以需要将win的分隔符号转换为python的路径分割符号

class Resources(object):
 @staticmethod
 def get_url(resource_name):
     if getattr(sys, 'frozen', False):  # 是否Bundle Resource
         base_path = sys._MEIPASS
         url_path = os.path.join(base_path,"resource\\{}".format(resource_name))
         value_t = url_path.replace('\\','/')
         # print(value_t)
         return value_t
     else:
         return "../src/mirror_picture_asset_library/resource/{}".format(resource_name)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡卡卡骨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值