2012-12-24 3 views
7

Quindi sto cercando di memorizzare l'output di un comando in una variabile. Io non lo voglio per visualizzare l'output durante l'esecuzione del comando di se ...impedisce subprocess.Popen dalla visualizzazione di output in python

Il codice che ho in questo momento è la seguente ...

def getoutput(*args): 
    myargs=args 
    listargs=[l.split(' ',1) for l in myargs] 
    import subprocess 
    output=subprocess.Popen(listargs[0], shell=False ,stdout=subprocess.PIPE) 
    out, error = output.communicate() 
    return(out,error) 


def main(): 

    a,b=getoutput("httpd -S") 

if __name__ == '__main__': 
    main() 

Se metto questo in un file ed eseguirlo su la riga di comando. Ottengo il seguente risultato anche se non ho una dichiarazione di stampa nel codice. Come posso evitare questo, mentre sto ancora salvando l'output?

#python ./apache.py 
httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xx for ServerName 
Syntax OK 

risposta

17

Quello che vedete è un errore di errore standard, non un'uscita di uscita standard. Il reindirizzamento stderr è controllato dall'argomento del costruttore stderr. Il valore predefinito è None, il che significa che non si verifica alcun reindirizzamento, motivo per cui viene visualizzato questo risultato.

Generalmente è consigliabile mantenere l'output di stderr poiché esso agevola il debug e non influisce sul normale reindirizzamento (ad esempio | e > il reindirizzamento della shell non acquisirà lo stderr per impostazione predefinita). Tuttavia è possibile reindirizzare da qualche altra parte lo stesso modo di fare stdout:

sp = subprocess.Popen(listargs[0], shell=False, 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
output, error = sp.communicate() 

Oppure si può solo cadere stderr:

devnull = open(os.devnull, 'wb') #python >= 2.4 
sp = subprocess.Popen(listargs[0], shell=False, 
    stdout=subprocess.PIPE, stderr=devnull) 

#python 3.x: 
sp = subprocess.Popen(listargs[0], shell=False 
    stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) 
+0

Ops, il mio male, grazie per chiarire che fino! – user1601716

+0

dovresti usare os.devnull per la portabilità a windows – jtaylor

2

volete prendere stdout, ma non sei la cattura stderr (standard error), che credo sia dove che il messaggio proviene.

output=subprocess.Popen(listargs[0], shell=False ,stdout=subprocess.PIPE, stderr=STDOUT) 

Ciò metterà qualsiasi cosa da stderr nello stesso punto di stdout.