PyFilesystem无法找到tar-fs中的现有文件,附VSCode下载提取脚本
解决PyFilesystem TarFS无法识别已下载tar文件的问题
我看了你这段下载并提取VSCode的脚本,遇到TarFS找不到文件的问题,大概率是下载环节的数据流处理不完整,或者TarFS读取时的指针位置不对导致的。咱们一步步来修复:
核心问题分析
- 你代码里的
shutil.copyfileobj(...)是未完成的调用,根本没把下载的数据流写入BytesIO,这会导致TarFS读取空数据; - 就算完成了写入,BytesIO的指针会停在数据流末尾,TarFS从这个位置读自然找不到任何内容;
~/Downloads/VSCode里的波浪号如果不展开成绝对路径,PyFilesystem可能无法正确识别目标路径。
修复后的完整脚本
#!/usr/bin/env python import requests import shutil import os from io import BytesIO from fs.tarfs import TarFS from fs.copy import copy_fs # 展开波浪号为绝对路径,避免路径识别异常 target_install_path = os.path.expanduser("~/Downloads/VSCode") dl_link = "https://go.microsoft.com/fwlink/?LinkID=620884" print("Sending Requests") r = requests.get(dl_link, stream=True) if r.status_code != 200: print(f"Error, status code: {r.status_code}") exit() tar_data = BytesIO() print("Downloading Data") # 将响应的原始流完整写入BytesIO shutil.copyfileobj(r.raw, tar_data) # 关键操作:把BytesIO的指针移到开头,否则TarFS会从末尾开始读 tar_data.seek(0) print("Extracting Files") # 初始化TarFS并提取内容 with TarFS(tar_data) as tar_fs: # 确保目标目录存在,不存在则创建 os.makedirs(target_install_path, exist_ok=True) # 复制tar包内的所有文件到目标路径 copy_fs(tar_fs, target_install_path) print(f"VSCode extracted to {target_install_path} successfully!")
关键修复点说明
- 路径展开:用
os.path.expanduser处理带~的路径,转换成当前用户主目录的绝对路径,避免PyFilesystem对相对路径的解析错误; - 完整写入数据流:
shutil.copyfileobj(r.raw, tar_data)把请求返回的原始二进制流完整写入BytesIO,这是下载环节的核心; - 重置文件指针:下载完成后,BytesIO的指针会停在数据末尾,
tar_data.seek(0)将指针移到开头,让TarFS能正确读取整个tar包内容,这是解决“找不到文件”问题的关键; - 提前创建目标目录:
os.makedirs(..., exist_ok=True)确保提取路径存在,避免复制时因目录不存在抛出异常。
额外排查建议
如果运行后还是有问题,可以试试这两步排查:
- 把BytesIO的内容写入本地文件,验证tar包完整性:
然后用with open("vscode.tar.gz", "wb") as f: f.write(tar_data.getvalue())tar -tvf vscode.tar.gz命令查看是否能列出文件,确认下载的是有效tar包; - 在TarFS的with块里添加文件列表打印,确认TarFS能读取到内容:
with TarFS(tar_data) as tar_fs: print("Files in tar包:", list(tar_fs.walk.files())) # 后续复制代码...
内容的提问来源于stack exchange,提问作者Uzaku
相关产品推荐
相关产品推荐

