subprocess.popen, capturar stdout

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


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.




-- 
*****************************************
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