2009-06-02 12 views

答えて

32

これは2つの異なるものです。 printは、一般にsys.stdoutに行きます。 stdin, stdout, and stderrの違いを知ることは価値があります - 彼らはすべてその用途があります。 は、通常のプログラム出力にはstdoutを、エラーメッセージ(プログラムの異常実行)にはstderrを予約する必要があります。これらのストリームを分割するユーティリティがあり、コードのユーザは通常の出力とエラーを区別できます。

+13

も有用であり得る、その標準エラーがバッファリングされていないことに注意します。 – JimB

+6

"プログラムの出力"を "非テキストまたは非ステータスのプログラム出力"に置き換える答えの文言を微調整しました。 stderrは、すべての場合にエラーメッセージ用に予約するべきではありません。たとえば、stdoutにダウンロードするプログラムは別のプログラムにパイプされますが、ダウンロードの進行状況はstderrに出力されます。 –

+0

@JimBどのような意味で? – JinSnow

80

printは、sys.stderrを含むファイル形式のオブジェクトに印刷できます。代わりにsys.stdoutのエラーsys.stderrを使用しての

print >> sys.stderr, 'Text' 

利点は以下のとおりです。

  • ファイルにstdoutをリダイレクトするユーザーが、彼女はまだ画面上のエラーを見ている場合。
  • バッファされていないため、sys.stderrをログファイルにリダイレクトすると、エラーが記録される前にプログラムがクラッシュする可能性が少なくなります。

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

+1

+1。すばらしいです!私はこの「印刷物」の性質を知らなかった – db42

30

注意:ストリームがインタラクティブデバイスに送信されるかどうかなど、いくつかの微妙な点があります。最大の驚きは、Python 3ではstderrが(少なくともUnixでは)バッファリングされていることです。例えば、端末ウィンドウで、次のは、Python 2で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) 
+4

非常に興味深い。私はなぜ彼らがPython 3でそのルートに行くことを決めたのだろうか? –

+0

端末にバッファリングされた行で、ファイルに書き込むときに完全にバッファされます。 :(FAIL。 –

2

スクリプトを実行する際にstderrとstdoutを別々のファイルにリダイレクトすることで分離すると便利です。私は通常、ログメッセージとプログラムの流れを追跡するためにstderrを使いますが、後でそれらを使うつもりのより有用なメッセージのためにstdoutを使います。

つstderrに書き込むための別の方法は、以下の例の通りである:

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

クール!:) log = sys.stderr.write; log( "hello") – AME