2012-12-24 20 views
7

çıktısını görüntülemedenPopen Bir komutun çıktısını bir değişkene depolamaya çalışıyorum. Ben bir dosyada bu koyarsan ... gerçi komutunu çalıştırırken bu görüntü çıkışı içinalt işlemi engeller. Python

Şu anda aşağıda sunulmuştur gibi kodu ...

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() 

istiyor ve bunu çalıştırmak yok komut satırı. Kodda bir baskı bildirimi olmamasına rağmen aşağıdaki çıktıyı alıyorum. Çıkışı saklarken bunu nasıl önleyebilirim?

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

cevap

17

Gördüğünüz standart çıktı çıkışı değil standart hata çıkışıdır. Stderr yönlendirmesi, stderr yapıcı argümanı tarafından kontrol edilir. Bu, varsayılan olarak None'a yönlendirilir, yani yeniden yönlendirme gerçekleşmez, bu yüzden bu çıkışı görürsünüz. Genellikle hata ayıklamaya yardımcı olduğu ve normal yönlendirmeyi etkilemediği için stderr çıktısını tutmak iyi bir fikirdir (ör. | ve > kabuk yönlendirmesi varsayılan olarak stderr'i yakalamayacaktır). Başka bir yerde aynı şekilde bunu yönlendirebilirsiniz Ancak stdout yapın:

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

Ya da sadece bırakabilirsiniz 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

Maalesef bu kadar takas için benim kötü, teşekkürler! – user1601716

+0

Pencerelere taşınabilirlik için os.devnull kullanmalısınız – jtaylor

2

Sen stdout'u alıcı yapıyor ancak ben bu mesajı nereden geldiğini düşünüyorum stderr'yi (standart hata) alıcı değiliz. Stdout'a aynı yere stderr'e bir şey koyacağız

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

.

İlgili konular