У меня есть немного инструмента командной строки, который читает из 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?
Потому что "stdin" и "stdout" подпроцесса принимают файловый дескриптор (который является числом), который является ресурсом операционной системы. Это маскируется тем фактом, что если вы передаете объект, модуль подпроцесса проверяет, есть ли у объекта атрибут fileno, и если он есть, он будет его использовать.
Операционная система не предоставляет объект 'gzip'. Открытый файл есть, сокет есть, труба есть. Объект Gzip - это объект, который предоставляет методы read () и write (), но не имеет атрибута fileno.
Вы можете взглянуть на метод submit () подпроцесса, возможно, вы захотите его использовать.