代码之家  ›  专栏  ›  技术社区  ›  Martin DeMello

在程序中使用python(如python-u)的无缓冲标准输出[duplicate]

  •  51
  • Martin DeMello  · 技术社区  · 15 年前


    Python output buffering

    有没有办法从我的代码中获得运行python-u的效果?如果失败,我的程序是否可以检查它是否在-u模式下运行,如果没有,则退出并显示错误消息?这是在linux上(ubuntu 8.10服务器)

    4 回复  |  直到 7 年前
        1
  •  49
  •   Bastien Léonard    15 年前

    >>> import os
    >>> import sys
    >>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
    >>> unbuffered.write('test')
    test>>> 
    >>> sys.stdout = unbuffered
    >>> print 'test'
    test
    

    在GNU/Linux上测试。它似乎也应该在Windows上工作。如果我知道如何重新打开sys.stdout,就会容易得多:

    sys.stdout = open('???', 'w', 0)
    

    参考资料:
    http://docs.python.org/library/stdtypes.html#file-objects
    http://docs.python.org/library/functions.html#open
    http://docs.python.org/library/os.html#file-object-creation

    [编辑]

        2
  •  34
  •   mikewaters    14 年前

    您始终可以在shebang行中传递-u参数:

    #!/usr/bin/python -u
    
        3
  •  8
  •   Boris Gorelik    4 年前

    编辑 (2020年10月)。正如在 a note to this answer ,在蟒蛇3中,stderr 也缓冲了。

    您可以利用stderr从未被缓冲的事实,尝试将stdout重定向到stderr:

    import sys
    #buffered output is here
    doStuff()
    
    oldStdout = sys.stdout
    sys.stdout = sys.stderr
    #unbuffered output from here on
    
    doMoreStuff()
    sys.stdout = oldStdout
    
    #the output is buffered again
    doEvenMoreStuff()
    
        4
  •  7
  •   Erik Aronesty    6 年前

    假设您在Windows上:

    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    

    ... 在Unix上:

    fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL)
    fl |= os.O_SYNC
    fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl)
    

    (Unix是从已注释的解决方案中复制的,而不是链接。)