14

そのため、コマンドの出力を変数に格納しようとしています。コマンドの実行中に出力を表示したくないのですが...

私が今持っているコードは次のとおりです...

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
4

2 に答える 2

30

表示されているのは、標準出力出力ではなく、標準エラー出力です。Stderr リダイレクトは、stderrコンストラクター引数によって制御されます。これNoneは、リダイレクトが発生しないことを意味します。これが、この出力が表示される理由です。

通常は、stderr の出力を保持することをお勧めします。これは、デバッグを支援し、通常のリダイレクトに影響を与えないためです (たとえば、デフォルトでは|、シェルのリダイレクトは stderr をキャプチャしません)。>ただし、stdout と同じ方法で別の場所にリダイレクトできます。

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

または、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)
于 2012-12-24T16:31:23.870 に答える
3

stdoutをキャッチしていますが、そのメッセージの送信元であると思われるstderr(標準エラー)をキャッチしていません。

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

これにより、stderrからstdoutと同じ場所に何でも配置されます。

于 2012-12-24T16:25:16.567 に答える