看到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))',结果如下
<class '_io.TextIOWrapper'> <class '_io.TextIOWrapper'>
两个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
本文详细探讨了Python中缓存机制的工作原理,特别是在不同版本的Python中如何影响标准输出和错误输出的显示顺序。通过对比Python 2.7和Python 3.6,解释了-u参数的作用,并提供了在Python 3中实现类似效果的方法。
1505

被折叠的 条评论
为什么被折叠?



