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