2011-11-02 8 views
7

Ho un lavoro piuttosto lungo, che viene eseguito per diversi minuti e quindi viene riavviato. Il compito uscite varie informazioni che mi cattura in questo modo:Come posso catturare l'output e mostrarlo allo stesso tempo con Python?

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

Il fatto è che sarà solo l'intera produzione alla volta. Mi piacerebbe mostrare l'output mentre il programma lo sta inviando allo stdout, mentre lo spingo ancora indietro in un buffer (ho bisogno di controllare l'output per la presenza di alcune stringhe). In Ruby lo farei in questo modo:

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

risposta

5

si può provare qualcosa di simile:

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

poterlo leggere una riga alla volta:

from subprocess import Popen, PIPE 

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

In questo modo , stai bloccando solo il tempo necessario per elaborare una singola riga.

+0

Dato che non è stata specificata una dimensione del buffer, verrà aggiunto un buffer 4KB tra i due processi, in modo che di solito non si blocchino. –

-1

È possibile utilizzare il comando "tee". Fa esattamente quello che ti serve.
http://www.computerhope.com/unix/utee.htm

+0

Sì, ma ho bisogno di elaborare il buffer in Python, per sapere se dovrei avviare nuovamente l'attività. – Geo

+0

l'OP sta chiedendo di monitorare un processo che hanno lanciato usando il popen all'interno del codice Python, quindi questo non è utile. – cowbert

Problemi correlati