python -u參數分別在python2和3中的情況

看到vscode 執行python代碼的時候,都會使用這個參數,特地去查了一下功能。

簡單看下官方文檔,python -h,如下

在這裏插入圖片描述
簡單說就是緩存開關的標誌,-u 就是 unbuffered。具體有什麼用呢,可以看下這個例子,來自這裏1,環境pyhton 2.7

import sys

sys.stdout.write("stdout1")
sys.stderr.write("stderr1")
sys.stdout.write("stdout2")
sys.stderr.write("stderr2")

期望輸出爲

stdout1stderr1stdout2stderr2

但實際的結果爲

stderr1stderr2stdout1stdout2

原因是python的緩存機制,雖然stderrstdout默認都是指向屏幕的,但是stderr是無緩存的,程序往stderr輸出一個字符,就會在屏幕上顯示一個;而stdout是有緩存的,只有遇到換行或者積累到一定的大小,纔會顯示出來。所以會先輸出兩個stderr

我又在python3.6的環境下試了下,發現加參數u和不加的效果是一樣的,這就有點奇怪了。深入研究了下,注意到官方說的是binary I/O 會沒有緩衝,但是 text I/O還是會有緩衝,所以測試了下sys.stderrsys.stdout的類型,python3 -c 'import sys; print(type(sys.stderr), type(sys.stdout))',結果如下

<class '_io.TextIOWrapper'> <class '_io.TextIOWrapper'>

兩個text I/O類型,所以在python3-u參數對這兩種輸出應該是失效的。關於text I/Obinary I/O,簡單說是就是繼承自I/O的兩個子類,具體看這裏。

那在python3中該如何實現,python2 -u參數的效果呢?python3sys.stdout.buffer 具有和 python2sys.stdout一樣的行爲2。所以,

import sys

sys.stdout.buffer.write(b"1")
sys.stderr.buffer.write(b"2")
sys.stdout.buffer.write(b"3")
sys.stderr.buffer.write(b"4")

執行,python3 -u 腳本名字.py.結果爲

1234

  1. https://github.com/pantsbuild/pants/issues/6385 ↩︎

  2. https://blog.csdn.net/wonengguwozai/article/details/81668240 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章