2012-12-24 14 views
7

私はコマンドの出力を変数に格納しようとしています。私は、ファイルでこれを置く場合...次のように私が今持っているコードがあるsubprocess.Popenがpythonで出力を表示しないようにする

...しかし、コマンドを実行している間、それは出力を表示する

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

をしたいし、それを実行しません。コマンドライン。コードにprintステートメントがないのに、次の出力が得られます。これを防ぐにはどうしたらいいですか?

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

答えて

17

あなたが見ているのは、標準出力の出力ではなく、標準出力の出力です。 Stderrのリダイレクトは、stderrコンストラクタ引数によって制御されます。デフォルトではNoneになります。つまり、リダイレクトが発生しないため、この出力が表示されます。

通常、stderr出力はデバッグに役立ち、通常のリダイレクトには影響しません(例:|および>シェルリダイレクトではデフォルトでstderrがキャプチャされません)。しかし、あなたがどこかにあなたが標準出力を行うのと同じ方法でそれをリダイレクトすることができます。

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

をそれとも、単に標準エラー出力をドロップすることができます。

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

おっと、それをクリアするための私の悪い、ありがとう! – user1601716

+0

ウィンドウへの移植性のためにos.devnullを使うべきです – jtaylor

2

あなたが標準出力をキャッチしているが、あなたは、私はそのメッセージがどこから来ていると思い標準エラー出力(標準エラー)をキャッチしていません。

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

stderrからstdoutと同じ場所に何かを配置します。

関連する問題