Tengo una pequeña herramienta de línea de comandos que lee de stdin. En la línea de comandos me iría bien ...¿Puedo usar un archivo gzip abierto con Popen en Python?
./foo < bar
o ...
cat bar | ./foo
Con un archivo gziped puedo correr
zcat bar.gz | ./foo
en Python que puedo hacer. ..
Popen(["./foo", ], stdin=open('bar'), stdout=PIPE, stderr=PIPE)
pero yo no puede hacer
import gzip
Popen(["./foo", ], stdin=gzip.open('bar'), stdout=PIPE, stderr=PIPE)
termino tener que ejecutar
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 stdin arg a Popen?
Sí, en realidad estoy usando p = Popen ([...]) y luego estoy leyendo p.communicate() [0]. Además, mi programa no se llama foo y mi archivo de entrada no se llama bar ;-) ¿Estás diciendo que no hay una solución fácil? Me resulta extraño que Popen (["./ foo",], stdin = gzip.open ('bar'), stdout = PIPE, stderr = PIPE) funciona (aunque devuelve un resultado incorrecto) y no genera una excepción. Está haciendo algo con él aunque no tenga un atributo fileno. –
Los atributos 'PIPE' y 'STDOUT' del módulo de subproceso son 'constantes especiales'; en el caso de stderr = STDOUT, la constante dice que el archivo que se debe pasar al proceso del cliente debe ser el mismo, que se pasa como stdout. En el caso de PIPE, se crea un nuevo archivo utilizando el comando del sistema operativo 'pipe()', la mitad del conducto (que en realidad son 2 números) se pasa al proceso del cliente y se le da uno. Lo que está escrito en una parte, se puede leer en la otra. No se puede arreglar de manera fácil, se necesitaría más programación. – ondra