Распакуйте стандартный вывод из вызова Popen подпроцесса с помощью gzip - PullRequest
2 голосов
/ 21 декабря 2011

возможно ли распаковать напрямую, используя gzip, стандартный вывод команды, запущенной через подпроцесс. Открыть?

Я пробовал это, но это не работает:

import subprocess
pipe = subprocess.Popen(["cat tmp.txt | gzip --stdout"], stdout=subprocess.PIPE)

import gzip
output = gzip.open(pipe.stdout)

while output.readline().rstrip():
    # Do something

Есть идеи?

1 Ответ

2 голосов
/ 21 декабря 2011

Можно передать открытый файл вместо имени файла в библиотеку gzip Python, создав экземпляр gzip.GzipFile напрямую, вместо использования вспомогательной функции gzip.open. Однако gzip Python нуждается в доступном для поиска файле, и он потерпит неудачу в потоке, используемом подпроцессом.

Способ создания экземпляра GzipFile -

output = gzip.GzipFile(fileobj=pipe.stdout)

Однако это не сработает, так как классу нужен доступный для поиска объект файла. Если у вас нет проблем с ожиданием всех выходных данных подпроцесса и кэшированием данных в памяти, вы можете обойти это с помощью StringIO, например:

import StringIO, subprocess
pipe = subprocess.Popen(["cat bla3.txt | gzip --stdout"], stdout=subprocess.PIPE, shell=True)
helper = StringIO.StringIO()     
helper.write(pipe.stdout.read())
helper.seek(0)
output = gzip.GzipFile(fileobj=helper) 

Если вы не можете этого сделать, вам придется скопировать некоторый код из gzip.py в Python и обработать данные и вызовы внутреннего zlib самостоятельно.

...