2011-11-02 10 views
7

Tengo un trabajo bastante largo, que se ejecuta durante varios minutos y luego se reinicia. La tarea emite diversa información que capturo de esta manera:¿Cómo puedo capturar la salida y mostrarla al mismo tiempo con Python?

output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate() 

El problema es que solo obtendré la salida completa a la vez. Me gustaría mostrar el resultado ya que el programa lo está enviando a stdout, mientras lo sigue empujando hacia atrás en un búfer (necesito verificar la salida para ver la presencia de algunas cadenas). En Rubí lo haría así:

IO.popen(cmd) do |io| 
    io.each_line do |line| 
    puts line 
    buffer << line 
    end 
end 

Respuesta

5

Usted puede intentar algo como esto:

cmd = ["./my_program.sh"] 
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE) # launch the process 
while p.poll() is None:   # check if the process is still alive 
    out = p.stdout.readline() # if it is still alive, grab the output 
    do_something_with(out)  # do what you want with it 
3

se podía leer que una línea a la vez:

from subprocess import Popen, PIPE 

p = Popen('grep -ir graph .', stdout=PIPE) 
while not p.returncode: 
    s = p.stdout.readline() 
    print s 
    p.poll() 

De esta manera, , solo está bloqueando el tiempo que lleva procesar para generar una sola línea.

+0

Dado que no especificó un tamaño de búfer, se agregará un búfer de 4 KB entre los dos procesos, por lo que generalmente no se bloquearán entre sí. –

-1

Puede usar el comando "tee". Hace exactamente lo que necesita de él.
http://www.computerhope.com/unix/utee.htm

+0

Sí, pero necesito procesar el búfer en Python, para saber si debería iniciar la tarea nuevamente. – Geo

+0

OP está preguntando sobre el monitoreo de un proceso que lanzaron usando popen desde el código de Python, por lo que no es útil. – cowbert

Cuestiones relacionadas