Python合并Linux split分割的4个下载文件时找不到文件如何解决
问题原因
subprocess.run默认未启用shell解析,会将传入的整串命令视为单个可执行文件路径查找,因此报错找不到文件。同时shell专属语法(重定向符>、路径代字符~)都无法被正常解析。- 目标路径
~/.u2net如果未提前创建,即使命令执行也会因目录不存在写入失败。
修复方案
方案1:调整subprocess调用(依赖系统cat命令)
修改subprocess调用逻辑,提前展开路径并创建目标目录,开启shell解析即可:
import requests import tempfile import os import subprocess as sp def download_files_from_github(path, model_name): # 展开~为实际用户目录路径 path = os.path.expanduser(path) # 提前创建目标目录,避免写入失败 os.makedirs(os.path.dirname(path), exist_ok=True) if model_name == "u2net": part1 = tempfile.NamedTemporaryFile(delete=False) part2 = tempfile.NamedTemporaryFile(delete=False) part3 = tempfile.NamedTemporaryFile(delete=False) part4 = tempfile.NamedTemporaryFile(delete=False) try: part1_content = requests.get('https://github.com/nadermx/backgroundremover/raw/main/models/u2aa') part1.write(part1_content.content) part1.close() part2_content = requests.get('https://github.com/nadermx/backgroundremover/raw/main/models/u2ab') part2.write(part2_content.content) part2.close() part3_content = requests.get('https://github.com/nadermx/backgroundremover/raw/main/models/u2ac') part3.write(part3_content.content) part3.close() part4_content = requests.get('https://github.com/nadermx/backgroundremover/raw/main/models/u2ad') part4.write(part4_content.content) part4.close() # 新增shell=True参数开启shell解析 stuff = sp.run('cat %s %s %s %s > %s' % (part1.name, part2.name, part3.name, part4.name, path), shell=True) print(stuff) finally: os.remove(part1.name) os.remove(part2.name) os.remove(part3.name) os.remove(part4.name) download_files_from_github('~/.u2net/u2net.pth', 'u2net')
方案2:原生Python实现合并(更推荐,跨平台无依赖)
不需要调用系统命令,直接通过Python IO操作合并分片,兼容性和安全性更好,还简化了代码逻辑:
import requests import tempfile import os def download_files_from_github(path, model_name): path = os.path.expanduser(path) os.makedirs(os.path.dirname(path), exist_ok=True) if model_name == "u2net": parts = [] try: # 批量下载所有分片 for suffix in ['a', 'b', 'c', 'd']: tmp = tempfile.NamedTemporaryFile(delete=False) resp = requests.get(f'https://github.com/nadermx/backgroundremover/raw/main/models/u2a{suffix}') tmp.write(resp.content) tmp.close() parts.append(tmp.name) # 按顺序合并写入目标文件 with open(path, 'wb') as out_file: for part_path in parts: with open(part_path, 'rb') as part_file: out_file.write(part_file.read()) finally: # 统一清理临时文件 for part_path in parts: if os.path.exists(part_path): os.remove(part_path) download_files_from_github('~/.u2net/u2net.pth', 'u2net')
内容的提问来源于stack exchange,提问作者nadermx
相关产品推荐
相关产品推荐

