Python的解释器中是否默认为sys.stdout
启用输出缓冲?
如果答案是肯定的,那么有什么方法可以禁用它?
到目前为止的建议:
- 使用
-u
命令行开关 - 将
sys.stdout
包装在每次写入后刷新的对象中 - 设置
PYTHONUNBUFFERED
env var -
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
还有其他方法可以在执行过程中以编程方式在sys
/ sys.stdout
设置一些全局标志吗?
#1楼
您可以使用“ python -u”(或#!/ usr / bin / env python -u等)或通过设置环境变量PYTHONUNBUFFERED跳过整个python进程的缓冲。
您还可以将sys.stdout替换为包装器之类的其他流,该流在每次调用后进行刷新。
class Unbuffered(object): def __init__(self, stream): self.stream = stream def write(self, data): self.stream.write(data) self.stream.flush() def writelines(self, datas): self.stream.writelines(datas) self.stream.flush() def __getattr__(self, attr): return getattr(self.stream, attr) import sys sys.stdout = Unbuffered(sys.stdout) print 'Hello'
#2楼
是的。
您可以使用“ -u”开关在命令行上禁用它。
或者,您可以在每次写入时在sys.stdout上调用.flush()(或将其包装为自动执行此操作的对象)
#3楼
是的,默认情况下启用。 您可以在调用python时通过在命令行上使用-u选项禁用它。
#4楼
获得无缓冲输出的一种方法是使用sys.stderr
而不是sys.stdout
或简单地调用sys.stdout.flush()
显式强制进行写操作。
您可以通过执行以下操作轻松重定向所有打印内容:
import sys; sys.stdout = sys.stderr
print "Hello World!"
或仅针对特定的print
语句进行重定向:
print >>sys.stderr, "Hello World!"
要重置标准输出,您可以执行以下操作:
sys.stdout = sys.__stdout__
#5楼
您可以创建一个无缓冲的文件,并将该文件分配给sys.stdout。
import sys
myFile= open( "a.log", "w", 0 )
sys.stdout= myFile
您无法神奇地更改系统提供的标准输出; 因为它是由操作系统提供给您的python程序的。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3159703