看到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
的缓存机制,虽然
stderr
和
stdout
默认都是指向屏幕的,但是
stderr
是无缓存的,程序往
stderr
输出一个字符,就会在屏幕上显示一个;而
stdout
是有缓存的,只有遇到换行或者积累到一定的大小,才会显示出来。所以会先输出两个
stderr
。
我又在
python3.6
的环境下试了下,发现加参数
u
和不加的效果是一样的,这就有点奇怪了。深入研究了下,注意到官方说的是
binary I/O
会没有缓冲,但是
text I/O
还是会有缓冲,所以测试了下
sys.stderr
和
sys.stdout
的类型,
python3 -c 'import sys; print(type(sys.stderr), type(sys.stdout))'
,结果如下
两个
text I/O
类型,所以在
python3
中
-u
参数对这两种输出应该是失效的。关于
text I/O
和
binary I/O
,简单说是就是继承自
I/O
的两个子类,具体看这里。
那在
python3
中该如何实现,
python2 -u
参数的效果呢?
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")
执行,
python3 -u 脚本名字.py
.结果为
1234
-
https://github.com/pantsbuild/pants/issues/6385 ↩︎
-
https://blog.csdn.net/wonengguwozai/article/details/81668240 ↩︎