2009-06-02 62 views

回答

32

它們只是兩個不同的東西。 print一般去sys.stdout。值得了解stdin, stdout, and stderr之間的區別 - 它們都有其用途。

特別是,stdout應該用於正常的程序輸出,而stderr應該只保留用於錯誤消息(異常程序執行)。有用於拆分這些流的實用程序,它允許您的代碼的用戶區分正常輸出和錯誤。

+13

還要注意的是標準錯誤是無緩衝,它可以是有用的。 – JimB 2009-06-02 16:08:49

+6

我會調整你的答案的措辭,用「非文本或非狀態程序輸出」替換「程序輸出」。在所有情況下,stderr也不應該保留爲錯誤消息 - 例如,下載到標準輸出的程序,該標準輸出到另一個程序,但將下載進度輸出到標準錯誤處理器(可以「斷開」管道)。 – 2010-08-09 04:03:19

+0

@JimB在什麼意義上? – JinSnow 2017-03-26 12:06:36

80

print可以打印在任何類似文件的對象上,包括sys.stderr

print >> sys.stderr, 'Text' 

使用sys.stderr的錯誤,而不是sys.stdout的優點是:

  • 如果stdout重定向到一個文件的用戶,她仍然在屏幕上看到的錯誤。
  • 它沒有被緩衝,所以如果sys.stderr被重定向到一個日誌文件,那麼在錯誤被記錄之前程序崩潰的可能性就會降低。

這個答案一點與Python 2編寫的。 對於Python 3,請改爲使用print('Text', file=sys.stderr)

+1

+1。大!我不知道'print'的這個屬性 – db42 2011-05-21 19:54:05

30

請注意:這裏有一些微妙之處,包括流是否要交互設備。最大的驚喜是,在Python 3中,stderr是行緩存的(至少在Unix中)。例如,在一個終端窗口,以下打印數在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) 
2

將腳本重定向到不同的文件時,將stderr和stdout分開很有用。我通常使用stderr來記錄日誌消息,並跟蹤程序的流程,但是使用stdout來獲取更多有用的消息,我將在稍後使用它們。

一個另一種方式編寫到stderr是如下面的例子:

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