Я пытаюсь использовать pycurl
чтобы загрузить файл tgz и извлечь его с помощью tarfile
, но не сохраняя файл tgz на диске и не имея всего tgz файла в памяти. Я хотел бы загрузить его и извлечь его в куски, потоковые.
Я знаю, как получить обратный вызов pycurl, который дает мне данные каждый раз, когда загружается новый кусок данных:
def write(data):
# Give data to tarfile to extract.
...
with contextlib.closing(pycurl.Curl()) as curl:
curl.setopt(curl.URL, tar_uri)
curl.setopt(curl.WRITEFUNCTION, write)
curl.setopt(curl.FOLLOWLOCATION, True)
curl.perform()
Я также знаю, как открыть tarfile в потоковом режиме:
output_tar = tarfile.open(mode='r|gz', fileobj=fileobj)
Но я не знаю, как соединить эти две вещи вместе, так что каждый раз, когда я получаю кусок по проводу, извлекается следующий фрагмент файла tar.
Если честно, если вы действительно ищете решение с чистым Python (это возможно, довольно утомительно), я бы предложил просто выложить в /usr/bin/tar
и передать данные в куски.
Что-то вроде
import subprocess
p = subprocess.Popen(['/usr/bin/tar', 'xz', '-C', '/my/output/directory'], stdin=subprocess.PIPE)
def write(data):
p.stdin.write(data)
with ...:
curl.perform()
p.close()
curl tar_uri | tar -xz
делает это вне Python. Как я могу сделать это в Python?