python中的无缓冲的stdout(如在python -u中)来自程序内部

unbuffered stdout in python (as in python -u) from within the program

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python output buffering

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


我能想到的最好办法是:

1
2
3
4
5
6
7
8
>>> import os
>>> import sys
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> unbuffered.write('test')
test>>>
>>> sys.stdout = unbuffered
>>> print 'test'
test

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

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

参考文献:http://docs.python.org/library/stdtypes.html文件对象http://docs.python.org/library/functions.html打开http://docs.python.org/library/os.html文件对象创建

[编辑]

请注意,最好先关闭sys.stdout,然后再覆盖它。


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

1
#!/usr/bin/python -u


假设您在Windows上:

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

…在Unix上:

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

(Unix是从注释解决方案而不是链接复制进来的。)


您可能会使用这样一个事实:stderr从不缓冲,并尝试将stdout重定向到stderr:

1
2
3
4
5
6
7
8
9
10
11
12
13
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()