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() |