看到vscode 執(zhí)行python代碼的時候,都會使用這個參數(shù),特地去查了一下功能。
簡單看下官方文檔,
python -h
,如下
簡單說就是緩存開關(guān)的標(biāo)志,-u 就是 unbuffered。具體有什么用呢,可以看下這個例子,來自這里
1
,環(huán)境
pyhton 2.7
import sys
sys.stdout.write("stdout1")
sys.stderr.write("stderr1")
sys.stdout.write("stdout2")
sys.stderr.write("stderr2")
期望輸出為
stdout1stderr1stdout2stderr2
但實際的結(jié)果為
stderr1stderr2stdout1stdout2
原因是
python
的緩存機制,雖然
stderr
和
stdout
默認都是指向屏幕的,但是
stderr
是無緩存的,程序往
stderr
輸出一個字符,就會在屏幕上顯示一個;而
stdout
是有緩存的,只有遇到換行或者積累到一定的大小,才會顯示出來。所以會先輸出兩個
stderr
。
我又在
python3.6
的環(huán)境下試了下,發(fā)現(xiàn)加參數(shù)
u
和不加的效果是一樣的,這就有點奇怪了。深入研究了下,注意到官方說的是
binary I/O
會沒有緩沖,但是
text I/O
還是會有緩沖,所以測試了下
sys.stderr
和
sys.stdout
的類型,
python3 -c 'import sys; print(type(sys.stderr), type(sys.stdout))'
,結(jié)果如下
兩個
text I/O
類型,所以在
python3
中
-u
參數(shù)對這兩種輸出應(yīng)該是失效的。關(guān)于
text I/O
和
binary I/O
,簡單說是就是繼承自
I/O
的兩個子類,具體看這里。
那在
python3
中該如何實現(xiàn),
python2 -u
參數(shù)的效果呢?
python3
的
sys.stdout.buffer
具有和
python2
中
sys.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")
執(zhí)行,
python3 -u 腳本名字.py
.結(jié)果為
1234
-
https://github.com/pantsbuild/pants/issues/6385 ??
-
https://blog.csdn.net/wonengguwozai/article/details/81668240 ??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
