代码之家  ›  专栏  ›  技术社区  ›  Bananach

Python:contextlib。redirect\u stdout有时无法实时工作

  •  3
  • Bananach  · 技术社区  · 7 年前

    我正在Ubuntu上使用Python3.5。以下脚本创建一个文件 out 并用越来越多的“你好”行填充:

    import contextlib
    with contextlib.redirect_stdout(open('out','w')):
        while True:
            print('Hello')
    

    然而,如果我通过添加一个调用 time.sleep() 出来

    import contextlib
    import time
    with contextlib.redirect_stdout(open('out','w')):
        while True:
            print('Hello')
            time.sleep(1)
    

    如果我通过将循环转化为有限循环来进一步更改代码,它将填充 出来

    有人能复制并解释一下吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Andrew Guy    7 年前

    contextlib ,但根本问题在于 open('out', 'w') 陈述

    为了防止输出缓冲,可以设置 buffering argument 0 如果您使用的是Python 2:

    import contextlib
    import time
    
    with contextlib.redirect_stdout(open('out','w', 0)):
        while True:
            print 'Hello'
            time.sleep(1)
    

    或者,一旦上下文管理器关闭文件(或者一旦缓冲内容超过一定大小),就会写入文件内容。

    stdout 在每个循环结束时,应达到预期效果:

    import contextlib
    import time
    import sys
    
    with contextlib.redirect_stdout(open('out','w')):
        while True:
            print('Hello')
            sys.stdout.flush()
            time.sleep(1)
    
        2
  •  1
  •   melpomene    7 年前

    我敢打赌以前有人问过这个问题,但我找不到一个好的副本。

    "\n" 遇到。但当标准输出引用文件时,它是块缓冲的。这意味着只有当缓冲区变满时(或显式刷新缓冲区或关闭句柄时),才会生成实际输出。