Tuberia desde python

Antonio Castro acastro en ciberdroide.com
Mar Abr 12 20:13:04 CEST 2005


On Sat, 9 Apr 2005, Israel Gutierrez wrote:

> Hola.
>
> Necesito hacer una tubería desde python con dos comandos del sistema, por
> ejemplo un ls y un grep, pero no doy con ello, esto es lo que tengo hasta
> ahora:
>
> import sys,os
> ferr=file('/tmp/prueba.log','w')
> salida=file('/tmp/salida.txt','w',)
> sys.stderr=ferr
>
> comin,comout,ferr=os.popen3('ls -lh /home/amphora -R')
> for item in comout:
>     comout,comout2,ferr=os.popen3('grep .pdf')
>     salida.write(comout2)
>
> En teoría lo que me devuelve el ls, se lo estoy pasando al grep, pero cuando
> lo ejecuto me devuelve enseguida al prompt de la shell y no veo nada
> en /tmp/salida.txt
>
> ¿Donde estoy metiendo la pata?

En un par de sitios.

En primer lugar popen3 te devuelve unos descriptores de ficheros
y tu intento de asignarles cualquier cosa no sirve de nada. Son
objetos devueltos por popen3() listos para usar.

En segundo lugar el grep se te quedará colgado porque tal como tu
lo usas leerá de la entrada estandar hasta que esta se cierre cosa
que tu no haces. En realidad esto se debe a detalles de implementación
que desconozco y no tendría porque ser así porque no es que grep no
termine, es que no empieza hasta que se cierra la entrada. Esto despista
bastante y realmente no podemos hablar de un funcionamiento tipo tubería
que sería lo suyo.

Creo que popen3() está muy bien pero yo creo que su comportamiento con
el descriptor de entrada estandar es mejorable.

==========8<---------------------------------------------------------
#! /usr/bin/python
# -*- coding: latin1 -*-

import os, sys

finp1, fout1, ferr1= os.popen3('ls -lh /home/droid/dat -R' , 'r')
finp2, fout2, ferr2= os.popen3("grep .pdf" , 'r')
for li1 in  fout1.readlines():
    finp2.write(li1)
finp2.close()
for li2 in fout2.readlines():
    print li2[:len(li2)-1]
==========8<------------------------------------------------------------


-- 
Un saludo
Antonio Castro

       /\     /\
         \\W//
        _|0 0|_
+-oOOO-(___o___)-OOOo---------------------+
| . . . . U U . Antonio Castro Snurmacher |
| . . . . . . . acastro en ciberdroide.com   |
+()()()---------()()()--------------------+




Más información sobre la lista de distribución Python-es