ead*_*ead 8 python linux windows stdout
stdout在写入控制台时,在Windows和Linux上缓冲的方式似乎有所不同.考虑一下这个小python脚本:
import time
for i in xrange(10):
time.sleep(1)
print "Working" ,
Run Code Online (Sandbox Code Playgroud)
在Windows上运行此脚本时,我们看到Working一个接一个地出现在中间的第二个等待.在Linux上,我们必须等待10秒,然后立即出现整行.
如果我们将最后一行更改为print "Working",则每行都会单独出现在Linux上.
所以在Linux上,stdout似乎是行缓冲而在Windows上根本没有.我们可以使用-u-option 关闭缓冲(在这种情况下,Linux上的脚本具有与Windows上相同的行为).该文件说:
-u强制stdin,stdout和stderr完全无缓冲.
实际上,它并没有说,没有-u-option stdin并且stdout是缓冲的.因此我的问题是:
stdout将被缓冲,无论哪个操作系统?至少在Windows和Linux中就是这种情况.当信息被刷新时,我的主要关注点不是(正如一些答案所假设的),但如果stdout没有缓冲,则可能是严重的性能损失而且不应该依赖它.
编辑:值得注意的是,对于Python3,Linux和Windows的行为是相同的(但这并不奇怪,因为行为是由print-method 的参数显式配置的).
假设您正在谈论CPython(可能),这与基础C实现的行为有关。
ISO C标准提到(C11 7.21.3 Files /3)三种模式:
还有其他引发字符出现的触发器(例如,即使没有输出换行符,缓冲区也已填满,在某些情况下请求输入或关闭流),但它们在您遇到的问题中并不重要。
什么是重要的是7.21.3 Files /7在同样的标准:
最初打开时,标准错误流未完全缓冲;当且仅当可以确定该流不引用交互式设备时,标准输入流和标准输出流才被完全缓冲。
注意那里的摆动室。除非实现知道不是交互式设备,否则标准输出可以行缓冲或不缓冲。
在这种情况下(控制台),它是一个交互式设备,因此不允许实现使用无缓冲。它是,但允许或者选择其他两种模式这就是为什么你看到的差异。
无缓冲的输出将在您输出消息后立即显示消息(类似于Windows行为)。行缓冲将延迟直到输出换行符(您的Linux行为)。
如果您真的想确保无论使用哪种模式都可以刷新消息,则只需自己刷新它们:
import time, sys
for i in xrange(10):
time.sleep(1)
print "Working",
sys.stdout.flush()
print
Run Code Online (Sandbox Code Playgroud)
就保证重定向到文件时输出将得到缓冲而言,这已经在我已经显示的标准引号中得到了介绍。如果可以确定该流正在使用非交互式设备,则它将被完全缓冲。这不是绝对的保证,因为它没有说明如何确定,但是如果任何实现都无法弄清楚这一点,我会感到惊讶。
在任何情况下,您都可以仅通过重定向输出并监视文件以查看其是否对每个输出刷新一次或在最后刷新一次来测试特定的实现。