禁用输出缓冲

一笑奈何 提交于 2020-02-27 02:50:33

Python的解释器中是否默认为sys.stdout启用输出缓冲?

如果答案是肯定的,那么有什么方法可以禁用它?

到目前为止的建议:

  1. 使用-u命令行开关
  2. sys.stdout包装在每次写入后刷新的对象中
  3. 设置PYTHONUNBUFFERED env var
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

还有其他方法可以在执行过程中以编程方式在sys / sys.stdout设置一些全局标志吗?


#1楼

Magnus Lycka的邮件列表中答复

您可以使用“ 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程序的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!