11

Python スクリプトから Java プログラムを呼び出していますが、不要な情報が大量に出力されています。私はstdout=NonePopen 関数に追加しようとしました:

subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)

しかし、それは同じことをします。何か案が?

4

2 に答える 2

43

3.3のドキュメントから:

stdin、stdout、およびstderrは、それぞれ、実行されたプログラムの標準入力、標準出力、および標準エラーファイルハンドルを指定します。有効な値は、PIPE、DEVNULL、既存のファイル記述子(正の整数)、既存のファイルオブジェクト、およびNoneです。

それで:

subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=subprocess.DEVNULL)

これは3.3以降にのみ存在します。しかし、ドキュメントには次のように書かれています。

DEVNULLは、特殊ファイルos.devnullが使用されることを示します。

そしてos.devnull、2.4に戻る方法で存在します(subprocess存在する前)。したがって、同じことを手動で行うことができます。

with open(os.devnull, 'w') as devnull:
    subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=devnull)

devnull1行に収まらない、より複雑なことをしている場合は、オブジェクトの構造だけでなく、オブジェクトの存続期間中ずっと開いたままにしておく必要があることに注意してくださいPopen。(つまり、すべてをwithステートメント内に入れます。)

/dev/null(POSIX)または(Windows)にリダイレクトする利点はNUL:、不要なパイプを作成しないことです。さらに重要なことに、サブプロセスがそのパイプへの書き込みをブロックするエッジケースに遭遇することはありません。

欠点は、理論的には、機能しないsubprocess一部のプラットフォームで機能する可能性があることです。os.devnullPOSIXとWindows、PyPy、およびJython(ほとんどの場合)でCPythonのみを気にする場合、これが問題になることはありません。その他の場合は、コードを配布する前にテストしてください。

于 2013-02-06T18:32:50.953 に答える
6

ドキュメントから:

デフォルト設定のNone、では、リダイレクトは発生しません。

stdoutに設定してからsubprocess.PIPE呼び出し.communicate()、キャプチャされた出力を単に無視する必要があります。

p = subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=subprocess.PIPE)
p.communicate()

subprocess.call()私はあなたのニーズに十分以上のものを使用することを疑っていますが:

subprocess.call(['java', '-jar', 'foo.jar'], stdout=subprocess.PIPE)
于 2013-02-06T17:20:34.493 に答える