web-dev-qa-db-ja.com

印刷vs stderr

printまたはstderrのどちらにも特定の利点または欠点はありますか?

27
Tyler

それらは2つの異なるものです。 printは通常sys.stdoutに送られます。 stdinstdout、およびstderr の違いを知っておく価値はあります。これらはすべて用途があります。

特に、stdoutは通常のプログラム出力に使用する必要がありますが、stderrはエラーメッセージ(異常なプログラム実行)にのみ予約する必要があります。これらのストリームを分割するためのユーティリティがあり、コードのユーザーは通常の出力とエラーを区別できます。

34
Daniel Lew

printは、_sys.stderr_を含む任意のファイルのようなオブジェクトに印刷できます。

_print >> sys.stderr, 'Text'
_

エラーに対して_sys.stderr_の代わりに_sys.stdout_を使用する利点は次のとおりです。

  • ユーザーがstdoutをファイルにリダイレクトした場合でも、画面にエラーが表示されます。
  • バッファリングされないため、_sys.stderr_がログファイルにリダイレクトされた場合、エラーがログに記録される前にプログラムがクラッシュする可能性が低くなります。

Python 2を念頭に置いて書かれたこの回答。Python 3の場合は、代わりにprint('Text', file=sys.stderr)を使用してください。

84

注意:ストリームがインタラクティブデバイスに送られるかどうかなど、ここには微妙な点があります。最大の驚きは、Python 3でstderrがラインバッファリングされることです(少なくともUnixでは)。たとえば、ターミナルウィンドウでは、次のように2秒ごとにPython 2:

for n in range(5):
    print >> sys.stderr, n,     # final comma to squelch newline character
    time.sleep(2)

一方、Python 3の場合、ループが終了すると、次のように数値がすべて一緒に出力されます。

for n in range(5):
    print(n, file=sys.stderr, end='')    # print n to sys.stderr with no newline char
    time.sleep(2)
31
Mitchell Model

スクリプトを実行するときに、stderrとstdoutを別のファイルにリダイレクトして分離すると便利です。私は通常、ログメッセージとプログラムのフローを追跡するためにstderrを使用しますが、後で使用するより有用なメッセージにはstdoutを使用します。

Stderrに書き込むもう1つの方法は、次の例のようになります。

import sys
sys.stderr.write("Error has occurred opening a file!")
2
Vahid Mirjalili