2010-04-01 1 views

risposta

7

Utilizzare subprocess.call(). Dalla documentazione:

subprocess.call (* popenargs, ** kwargs)
comando Esegui con argomenti. Attendere il completamento del comando, quindi restituire l'attributo returncode. Gli argomenti sono gli stessi del costruttore di Popoli .

Edit:

subprocess.call() utilizza wait(), e wait() è vulnerabile a situazioni di stallo (come Tommy Herbert ha sottolineato). Dalla documentazione:

Attenzione: Questo stallo se il processo bambino genera abbastanza uscita ad un tubo stdout o stderr tale che blocca in attesa del tubo di OS buffer per accettare altri dati. Utilizzare communicate() per evitare ciò.

Così, se il comando genera un sacco di uscita, utilizzare communicate() invece:

p = subprocess.Popen(
    ["scanx", "--udp", host], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE) 
out, err = p.communicate() 
+0

A differenza di poll(), c'è un pericolo di stallo qui. –

+0

@ Tommy, buon punto. Ampliato su questo nella mia risposta. Grazie. –

+0

Grazie mille ragazzi :) –

7

Se non avete bisogno di output a tutti si può passare al devnull stdout e stderr. Non so se questo può fare la differenza ma passare un bufsize. L'utilizzo di devnull ora non ha più problemi di stallo

+0

Nel mio caso il "bufsize = x" non ha risolto il mio problema se stavo ancora usando "stdout = subprocess.Pipe". Ma lo "stdout = null" ha funzionato bene. Tuttavia, python consente già di usare "stdout = None" che può sostituire la variabile nulla che è un po 'inutile qui. ;) – ForceMagic

+0

Non è la stessa cosa, "... Con Nessuno, non si verificherà alcun reindirizzamento, gli handle del file del bambino saranno ereditati dal genitore ..." insted usign il mio esempio stai reindirizzando tutto l'output su un dispositivo nullo. –