Я могу использовать открытый gzip файл с Popen в Python?

У меня есть немного инструмента командной строки, который читает из stdin. На командной строке я работал бы также...

./foo < bar

или...

cat bar | ./foo

С gziped файлом я могу работать

zcat bar.gz | ./foo

в Python я могу сделать...

Popen(["./foo", ], stdin=open('bar'), stdout=PIPE, stderr=PIPE)

но я не могу сделать

import gzip
Popen(["./foo", ], stdin=gzip.open('bar'), stdout=PIPE, stderr=PIPE)

Я волную необходимость работать

p0 = Popen(["zcat", "bar"], stdout=PIPE, stderr=PIPE)
Popen(["./foo", ], stdin=p0.stdout, stdout=PIPE, stderr=PIPE)

Я делаю что-то не так? Почему я не могу использовать gzip.open ('панель') в качестве stdin аргумента к Popen?

6
задан eric.frederich 28 April 2010 в 20:15
поделиться

1 ответ

Потому что "stdin" и "stdout" подпроцесса принимают файловый дескриптор (который является числом), который является ресурсом операционной системы. Это маскируется тем фактом, что если вы передаете объект, модуль подпроцесса проверяет, есть ли у объекта атрибут fileno, и если он есть, он будет его использовать.

Операционная система не предоставляет объект 'gzip'. Открытый файл есть, сокет есть, труба есть. Объект Gzip - это объект, который предоставляет методы read () и write (), но не имеет атрибута fileno.

Вы можете взглянуть на метод submit () подпроцесса, возможно, вы захотите его использовать.

4
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: