【问题标题】:Merge 4 downloaded files into one将4个下载的文件合并为一个
【发布时间】:2021-12-06 16:57:29
【问题描述】:

我目前有 4 个文件,我使用 linux 命令 split 将其分解为 50 meg 文件。

我目前正在尝试这个,但它告诉我找不到文件。

import requests
import tempfile
import os
import subprocess as sp

def download_files_from_github(path, model_name):
    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()
            stuff = sp.run('cat %s %s %s %s > %s' % (part1.name, part2.name, part3.name, part4.name, path))
            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')

我得到了这个错误

$ python tests.py
Traceback (most recent call last):
  File "tests.py", line 34, in <module>
    download_files_from_github('~/.u2net/u2net.pth', 'u2net')
  File "tests.py", line 25, in download_files_from_github
    stuff = sp.run('cat %s %s %s %s > %s' % (part1.name, part2.name, part3.name, part4.name, path))
  File "/usr/lib/python3.6/subprocess.py", line 423, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'cat /tmp/tmp28877_uq /tmp/tmpx2t9s9we /tmp/tmpj4g8ahhw /tmp/tmpty1x7pjv > ~/.u2net/u2net.pth': 'cat /tmp/tmp28877_uq /tmp/tmpx2t9s9we /tmp/tmpj4g8ahhw /tmp/tmpty1x7pjv > ~/.u2net/u2net.pth'

【问题讨论】:

标签: python


【解决方案1】:

正如用户建议的那样,subprocess 认为您想将整个命令作为一个单独的东西执行,但失败了。

一个不错的选择是将subprocess.run 字符串参数替换为一个列表:

# pass a list directly
stuff = sp.run(["cat", part1.name, part2.name, part3.name, part4.name, ">", path])

这对我有用。

【讨论】:

    【解决方案2】:

    即使问题已经解决了,如果我不得不这样做,我会做如下的事情:

    def download_files_from_github(git_paths, out_file, model_name):
        if model_name == "u2net":
            download_status = {}
            with open(out_file, 'wb') as out:
                    for git_path in git_paths:
                        response = requests.get(git_path)
                        out.write(response.content)
                        download_status[git_path] = response.status_code
            return download_status
    

    然后调用程序并捕获响应 status_code(这很重要,因为如果您为其中一个 url 获得 404 status_code,您可能希望在调用程序中丢弃输出文件,或者您可能希望在下载函数中引发错误如果 status_code 为 404,则为自身)

    status = download_files_from_github(['https://github.com/nadermx/backgroundremover/raw/main/models/u2aa',
     'https://github.com/nadermx/backgroundremover/raw/main/models/u2ab',
     'https://github.com/nadermx/backgroundremover/raw/main/models/u2acc',
     'https://github.com/nadermx/backgroundremover/raw/main/models/u2ad'],
    '<your consolidated out file>', 'u2net')
    
    print(status)
    

    【讨论】:

      【解决方案3】:

      尝试改变

      stuff = sp.run('cat %s %s %s %s > %s' % (part1.name, part2.name, part3.name, part4.name, path))
      

      到

      stuff = sp.run(f'cat {part1.name} {part2.name} {part3.name} {part4.name} > {path}'.split())
      

      您需要将列表传递给 sp.run,而不是字符串。我所做的基本上是创建执行字符串,然后将其拆分为命令和参数列表。

      【讨论】:

        猜你喜欢
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 2020-12-16
        • 2014-06-27
        • 2012-01-07
        相关资源
        最近更新 更多