当在控制台输出stdout
时,Windows和Linux的缓冲方式存在差异。考虑以下Python脚本:
import time
for i in xrange(10):
time.sleep(1)
print "Working" ,
在Windows上运行此脚本时,我们会看到一个接一个地出现
Working
,每个之间需要等待一秒钟。在Linux上,我们必须等待10秒钟,然后整行一起出现。如果我们将最后一行改为
print "Working"
,则在Linux上每一行也会单独出现。因此,在Linux上,
stdout
似乎是按行缓冲的,而在Windows上则没有。我们可以通过使用-u
选项关闭缓冲(在这种情况下,Linux上的脚本与Windows上的脚本具有相同的行为)。文档中写道:
实际上,它并没有说,没有-u 强制stdin、stdout和stderr完全不带缓冲区。
-u
选项时stdin
和stdout
是有缓冲的。因此我的问题如下:
- 为什么在Linux/Windows上有不同的行为?
- 是否有某种保证,即如果重定向到文件,无论哪个操作系统,
stdout
都将被缓冲?至少在Windows和Linux上似乎是这样。
stdout
没有被缓冲,那么它可能会严重影响性能,而且人们不应该依赖它。
编辑:值得注意的是,对于Python3,Linux和Windows的行为是相等的(但这并不令人惊讶,因为行为是通过print
方法的参数显式配置的)。