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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:06:05