使用qrc提取打包Zip文件时出现OSError错误的解决方案求助
解决从QRC资源提取Zip文件的OSError问题
嘿,我来帮你看看这个问题!你遇到的OSError: [Errno 22] Invalid argument是因为代码里有两个核心错误,咱们一步步拆解解决:
问题出在哪?
- 错误使用
zipfile.ZipInfo:ZipInfo是用来描述Zip归档里单个文件的元数据对象,根本不是用来打开整个Zip文件的构造器。你用它传入QRC路径,完全不符合它的设计用途。 - QRC路径无法被标准库直接识别:
:/files/file.zip是Qt资源系统的特殊路径,Python标准库的zipfile模块不知道怎么访问这个路径下的资源,必须通过Qt的API先读取资源内容。
修正后的解决方案
要提取QRC里的Zip文件,得先通过Qt的工具把资源内容读出来,再转成zipfile能处理的类文件对象,具体步骤如下:
示例代码(以PyQt5为例)
import zipfile from io import BytesIO from PyQt5.QtCore import QFile, QIODevice # 1. 用Qt的QFile读取QRC中的Zip资源 qrc_zip_path = ":/files/file.zip" qfile = QFile(qrc_zip_path) if not qfile.open(QIODevice.ReadOnly): print(f"打开资源失败: {qfile.errorString()}") exit(1) # 2. 将读取到的二进制数据转为类文件对象 zip_binary_data = BytesIO(qfile.readAll()) qfile.close() # 3. 用zipfile正常处理Zip文件 with zipfile.ZipFile(zip_binary_data, 'r') as zf: # 提取所有文件到当前目录(可以指定路径作为extractall的参数) zf.extractall() # 如果需要逐个提取,也可以这样写: # for file_info in zf.infolist(): # zf.extract(file_info)
针对PySide的适配
如果你用的是PySide2/PySide6,只需要修改导入语句即可:
# PySide2 from PySide2.QtCore import QFile, QIODevice # PySide6 from PySide6.QtCore import QFile, QIODevice
额外说明
- 确保你的
resources模块已经正确编译(通过pyrcc5或对应的PySide工具把.qrc文件转成.py文件),否则QRC资源无法被正确访问。 - 如果需要提取到指定目录,给
extractall()或extract()方法传入目标路径参数即可,比如zf.extractall("./extracted_files")。
内容的提问来源于stack exchange,提问作者zen
相关产品推荐
相关产品推荐

