You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用qrc提取打包Zip文件时出现OSError错误的解决方案求助

解决从QRC资源提取Zip文件的OSError问题

嘿,我来帮你看看这个问题!你遇到的OSError: [Errno 22] Invalid argument是因为代码里有两个核心错误,咱们一步步拆解解决:

问题出在哪?

  1. 错误使用zipfile.ZipInfo:ZipInfo是用来描述Zip归档里单个文件的元数据对象,根本不是用来打开整个Zip文件的构造器。你用它传入QRC路径,完全不符合它的设计用途。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:07:53