またはのいずれかに特定の長所または短所はありますprint
かstderr
?
4 に答える
print
を含む任意のファイルのようなオブジェクトに印刷できますsys.stderr
。
print >> sys.stderr, 'Text'
sys.stderr
代わりにエラーに使用する利点は次のsys.stdout
とおりです。
- ユーザーがstdoutをファイルにリダイレクトした場合でも、画面にエラーが表示されます。
- バッファリングされないため、
sys.stderr
がログファイルにリダイレクトされると、エラーがログに記録される前にプログラムがクラッシュする可能性が低くなります。
この答えはPython2を念頭に置いて書かれています。Python 3の場合は、print('Text', file=sys.stderr)
代わりに使用してください。
それらは2つの異なるものです。print
通常はに行きsys.stdout
ます。、、、の違いを知っておく価値がstdin
ありstdout
ますstderr
-それらはすべて用途があります。
特に、stdout
通常のプログラム出力に使用するstderr
必要がありますが、エラーメッセージ(異常なプログラム実行)にのみ予約する必要があります。これらのストリームを分割するためのユーティリティがあります。これにより、コードのユーザーは通常の出力とエラーを区別できます。
注意:ここには、ストリームがインタラクティブデバイスに送られるかどうかなど、微妙な点がいくつかあります。最大の驚きは、Python 3ではstderrが(少なくともUnixでは)行バッファリングされていることです。たとえば、ターミナルウィンドウで、Python2では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!")