subprocess.popen, capturar stdout

Oswaldo Hernández listas en soft-com.es
Mar Oct 30 18:40:30 CET 2007


Oswaldo Hernández escribió:
> Hola, gracias por contestar,
> 
> Arnau Sanchez escribió:
> ...
>>
>> Prueba y nos dices si algo de esto te funciona.
>>
> 
> He probado con y sin generador y el resultado es el mismo. Hasta que no 
> acaba la aplicación no obtengo el stdout, no se si el problema puede 
> estar en otro sitio.
> 
> Para realizar la prueba he creado dos scripts:
> 
> - runapp.py ---------------------------------
> #!/usr/bin/env python
> #coding=utf-8
> 
> import subprocess
> import time
> 
> def runapp(app):
>     pr = subprocess.Popen(app.split(), stdin=None, stdout = 
> subprocess.PIPE, stderr=subprocess.PIPE)
> 
>     for line in readlines(pr.stdout):
>         print "local:%s, app:%s" % (time.time(), line),
> 
>     #for line in pr.stdout:
>     #    print "local:%s, app:%s" % (time.time(), line),
>     #pr.wait()
> 
>     print "finalizado con codigo %s" % pr.poll()
> 
> def readlines(fd):
>     while 1:
>         line = fd.readline()
>         if not line:
>             break
>         yield line
> 
> # ejecucion
> runapp("python testrunapp.py")
> 
> 
> - testrunapp.py ---------------------------------
> #!/usr/bin/env python
> #coding=utf-8
> 
> import time
> 
> #enviar a stdout el tiempo cada segundo durante 10 segundos
> veces = 10
> ahora = time.time()
> while veces > 0:
>     while time.time() < ahora + 1:
>         pass
>     ahora = time.time()
>     print ahora
>     veces -= 1
> 
> 
> 
> Al ejecutar runapp.py este llama a testrunapp.py, toma su stdout y lo 
> imprime junto con el time en el que lee el stdout.
> 
> El resultado tanto en XP como en una maquina debian, ambas con python 
> 2.5 es el siguiente:
> 
> oswaldo en server2:/home/X/Python/Otros/AutoBackup$ python runapp.py
> local:1193764260.66, app:1193764251.65
> local:1193764260.66, app:1193764252.65
> local:1193764260.66, app:1193764253.65
> local:1193764260.66, app:1193764254.65
> local:1193764260.66, app:1193764255.65
> local:1193764260.66, app:1193764256.65
> local:1193764260.66, app:1193764257.65
> local:1193764260.66, app:1193764258.65
> local:1193764260.66, app:1193764259.65
> local:1193764260.67, app:1193764260.65
> finalizado con codigo 0
> 
> Como veras la aplicacion auxiliar envia un resultado cada segundo, pero 
> el programa principal los recibe todos al finalizar.
> 

Aqui otra vez ;)

He realizado un cambio en la aplicacion testrunapp.py añadiendole despues del print:
	sys.stdout.flush()
y ahora si funciona:
oswaldo en server2:/home/X/Python/Otros/AutoBackup$ python runapp.py
local:1193765777.58, app:1193765777.58
local:1193765778.58, app:1193765778.58
local:1193765779.58, app:1193765779.58
local:1193765780.58, app:1193765780.58
local:1193765781.58, app:1193765781.58
local:1193765782.58, app:1193765782.58
local:1193765783.58, app:1193765783.58
local:1193765784.58, app:1193765784.58
local:1193765785.58, app:1193765785.58
local:1193765786.58, app:1193765786.58
finalizado con codigo 0

Pero ya fuera de la demostración, lo he probado con una de las aplicación que pretendo utilizar y al 
parecer esta no hace el flush, los datos me llegan al finalizar.

¿Habria alguna forma de forzar la lectura de esos datos?

-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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