Python スクリプトから Java プログラムを呼び出していますが、不要な情報が大量に出力されています。私はstdout=None
Popen 関数に追加しようとしました:
subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)
しかし、それは同じことをします。何か案が?
Python スクリプトから Java プログラムを呼び出していますが、不要な情報が大量に出力されています。私はstdout=None
Popen 関数に追加しようとしました:
subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)
しかし、それは同じことをします。何か案が?
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)
devnull
1行に収まらない、より複雑なことをしている場合は、オブジェクトの構造だけでなく、オブジェクトの存続期間中ずっと開いたままにしておく必要があることに注意してくださいPopen
。(つまり、すべてをwith
ステートメント内に入れます。)
/dev/null
(POSIX)または(Windows)にリダイレクトする利点はNUL:
、不要なパイプを作成しないことです。さらに重要なことに、サブプロセスがそのパイプへの書き込みをブロックするエッジケースに遭遇することはありません。
欠点は、理論的には、機能しないsubprocess
一部のプラットフォームで機能する可能性があることです。os.devnull
POSIXとWindows、PyPy、およびJython(ほとんどの場合)でCPythonのみを気にする場合、これが問題になることはありません。その他の場合は、コードを配布する前にテストしてください。
ドキュメントから:
デフォルト設定の
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)