¿Puedo usar un archivo gzip abierto con Popen en Python?

Tengo una pequeña herramienta de línea de comandos que lee desde stdin. En la línea de comandos me gustaría ejecutar …

./foo < bar 

o …

 cat bar | ./foo 

Con un archivo gziped puedo correr

 zcat bar.gz | ./foo 

en Python puedo hacer …

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

pero no puedo hacer

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

Termino teniendo que correr

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

¿Estoy haciendo algo mal? ¿Por qué no puedo usar gzip.open (‘bar’) como un stdin arg para Popen?

Debido a que ‘stdin’ y ‘stdout’ del subproceso toman el descriptor de archivo (que es un número), que es un recurso del sistema operativo. Esto está enmascarado por el hecho de que si pasa un objeto, el módulo de subproceso verifica si el objeto tiene un atributo ‘fileno’ y si lo tiene, lo usará.

El objeto ‘gzip’ no es algo que proporciona un sistema operativo. Un archivo abierto es, un socket es, una tubería es. El objeto Gzip es un objeto que proporciona los métodos de lectura () y escritura () pero no un atributo fileno.

Sin embargo, puede mirar el método de subproceso comunicate (), es posible que desee utilizarlo.