禁用输出缓冲

Python的sys.stdout解释器默认启用输出缓冲吗?

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

迄今为止的建议:

  • 使用-u命令行开关
  • sys.stdout包装在每次写入后刷新的对象中
  • 设置PYTHONUNBUFFERED env var
  • sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
  • 是否有任何其他方式来在执行过程中以编程方式在sys / sys.stdout设置全局标志?


    来自Magnus Lycka邮件列表上的答案:

    您可以使用“python -u”(或#!/ usr / bin / env python -u等)或通过设置环境变量PYTHONUNBUFFERED来跳过整个python进程的缓冲。

    你也可以用一些其他的数据流来代替sys.stdout,比如每次调用后都会刷新的wrapper。

    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'
    

    # reopen stdout file descriptor with write mode
    # and 0 as the buffer size (unbuffered)
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
    

    积分:“Sebastian”,在Python邮件列表中的某处。


    我宁愿把我的答案放在如何刷新Python打印输出? 或者在Python的打印函数中调用它时刷新缓冲区,但是由于它们被标记为这个缓冲区的重复项(我不同意),我会在这里回答它。

    由于Python 3.3 print()支持关键字参数“flush”(请参阅​​文档):

    print('Hello World!', flush=True)
    
    链接地址: http://www.djcxy.com/p/77201.html

    上一篇: Disable output buffering

    下一篇: How to use output of SqlPlus query to prompt user for more input