Могу ли я использовать открытый файл gzip с Popen в Python? - PullRequest
6 голосов
/ 29 апреля 2010

У меня есть небольшой инструмент командной строки, который читает из стандартного ввода. В командной строке я бы запустил либо ...

./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 ('bar') в качестве стандартного аргумента для Popen?

1 Ответ

4 голосов
/ 29 апреля 2010

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

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

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

...