print
またはstderr
のどちらにも特定の利点または欠点はありますか?
それらは2つの異なるものです。 print
は通常sys.stdout
に送られます。 stdin
、stdout
、およびstderr
の違いを知っておく価値はあります。これらはすべて用途があります。
特に、stdout
は通常のプログラム出力に使用する必要がありますが、stderr
はエラーメッセージ(異常なプログラム実行)にのみ予約する必要があります。これらのストリームを分割するためのユーティリティがあり、コードのユーザーは通常の出力とエラーを区別できます。
print
は、_sys.stderr
_を含む任意のファイルのようなオブジェクトに印刷できます。
_print >> sys.stderr, 'Text'
_
エラーに対して_sys.stderr
_の代わりに_sys.stdout
_を使用する利点は次のとおりです。
sys.stderr
_がログファイルにリダイレクトされた場合、エラーがログに記録される前にプログラムがクラッシュする可能性が低くなります。Python 2を念頭に置いて書かれたこの回答。Python 3の場合は、代わりにprint('Text', file=sys.stderr)
を使用してください。
注意:ストリームがインタラクティブデバイスに送られるかどうかなど、ここには微妙な点があります。最大の驚きは、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)
スクリプトを実行するときに、stderrとstdoutを別のファイルにリダイレクトして分離すると便利です。私は通常、ログメッセージとプログラムのフローを追跡するためにstderrを使用しますが、後で使用するより有用なメッセージにはstdoutを使用します。
Stderrに書き込むもう1つの方法は、次の例のようになります。
import sys
sys.stderr.write("Error has occurred opening a file!")