2009-11-30 22 views
6

Sto eseguendo un sottoprogramma utilizzando subprocess.popen. Quando avvio il mio programma Python dalla finestra di comando (cmd.exe), il programma scrive alcune informazioni e date nella finestra man mano che il programma si evolve.Leggere lo stdout in modo asincrono dal sottoprocesso.Popen

Quando eseguo il mio codice Python non in una finestra di comando, si apre una nuova finestra di comando per l'output di questo sottoprogramma, e voglio evitarlo. Quando ho usato il seguente codice, non mostra la finestra cmd, ma anche non stampa lo stato:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE) 
print p.stdout.read() 

Come faccio a visualizzare l'output del sottoprogramma in uscita del mio programma, come si verifica?

+2

Perché questo wiki della comunità? –

+2

"finestra di windows" Quale finestra di Windows? Stai usando un framework GUI? Quale? –

+0

beh, sto eseguendo il modello con arcgis. quando faccio clic sul mio strumento che ho creato laggiù, viene visualizzata una finestra che mostra i progressi. Voglio vedere le linee che appaiono nella mia finestra di comando. – Mesut

risposta

7

Usare questo:

cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE) 
for line in cmd.stdout: 
    print line.rstrip("\n") 
cmd.wait() # you may already be handling this in your current code 

noti che si dovrà ancora aspettare il sottoprogramma per svuotare il buffer stdout (che è comunemente tamponata diverso quando non crei una finestra terminale), quindi si può, non vedere ogni riga istantaneamente mentre il sottoprogramma lo stampa (ciò dipende dai vari dettagli del sistema operativo e dai dettagli del sottoprogramma).

Notare anche come ho rimosso la shell = True e sostituito l'argomento stringa con un elenco, che è generalmente raccomandato.

+0

in alternativa a 'line.rstrip ..' puoi usare 'linea', (nota la virgola finale) –

+2

['per riga in iter (cmd.stdout.readline," "): print line,'] (http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line) potrebbe fornire un output più immediato evitando probabilmente il buffer read-ahead nell'iter iter del file (nota: il sottoprogramma deve ancora scaricare lo stdout) – jfs

+1

Non vedo perché questo è asincrono. – ManuelSchneid3r

Problemi correlati