2014-12-05 50 views
4

當我試圖在我的Python解釋器3(Python的3.4.2,通過BREW安裝)的一些東西,我遇到了一些奇怪的輸出,我沒有預料:奇怪的行爲,使用sys模塊

>>> import sys 
>>> sys.stdout.write("foo") 
foo3 
>>> sys.stderr.write("bar") 
3 
bar 

經過試驗不同的字符串,我認爲數字是我通過的輸入的長度。

我在Python 2.7.8想這(給在輸出沒有數字)和Python 3.4.2 virtualenv創建(給出了同樣的結果)

是輸出應該是這樣嗎?

+1

我相信這是預期的行爲。該數字只是因爲你在python REPL而被打印出來。如果您將此代碼作爲腳本運行,則不會有任何數字。 – zaquest 2014-12-05 08:24:50

回答

5

你說得對,它是長度。在Python 2中,File.write()方法返回None。當移動到Python 3時,返回值更改爲寫入的字符數。

您從stdoutstderr獲取不同輸出的原因可能與事件在文件句柄上顯示的順序有關。

對於stdout,write輸出"foo"然後REPL循環(在PIN號碼和ATM機的傳統中)將計數輸出到相同的流。

對於stderr,REPL循環可能首先輸出標準輸出(長度),然後輸出標準錯誤的內容。

或者,它可能是完全非確定性的,它可能不是您應該依賴的東西,尤其是因爲除了解釋器的交互模式之外,REPL循環並不存在。

+0

明白了。感謝你的回答! – dazedconfused 2014-12-05 08:31:34

+1

'stderr'和'stdout'是行緩衝的;所以寫一個換行符到'stdout'就會刷新它。但是'stderr'沒有被刷新,所以你不會在你的終端上看到'bar',直到它在代碼運行後也被明確地刷新*,這就是爲什麼它打印得太晚的原因。如果你爲寫入的數據添加一個換行符,'bar'出現在'4'之前。 – 2014-12-10 08:50:34

+0

@MartijnPieters:剛纔看到這個,謝謝澄清! – dazedconfused 2014-12-16 05:29:21

4

在python解釋器中,當您打印某些內容時,它會顯示stdout和stderr上的結果。

我在python 3.4中測試了它。這是我認爲正在發生的

sys.std.write("foo") = > foo3 

解釋器將「foo」寫入stdout。解釋器然後輸出sys.stdout.write方法的結果,即3。最終結果是foo3。試試sys.stdout.write(「foo \ n \ n」)。這可能會幫助你看到。

sys.stderr.write("bar") => 
3 
bar 

err流不如stdout快。寫入的3個結果首先顯示一個新的行字符。酒吧打印後。

+0

感謝您的解釋! – dazedconfused 2014-12-05 08:40:08

+1

這與'stderr'的速度無關。它不會更慢或更快。 'stdout'和'stderr'都是*行緩衝*,這意味着它們在寫入換行符時自動刷新。這裏沒有新行被寫入,但REPL確實寫出了用新行寫入的字節數。因此'sys.stdout'被REPL寫入的換行符刷新,但是'sys。stderr'永遠不會看到換行符。代碼運行後,無論如何,Python都會明確刷新sys.stderr,所以只有在終端中顯示消息。 – 2014-12-10 08:54:58