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

时间:2009-05-19 09:05:18

标签: python

  

可能重复:
  Python output buffering

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

4 个答案:

答案 0 :(得分:45)

我能想出的最好的结果:

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

[编辑]

请注意,在覆盖之前关闭sys.stdout可能会更好。

答案 1 :(得分:24)

你总是可以在shebang行中传递-u参数:

#!/usr/bin/python -u

答案 2 :(得分: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从评论的解决方案中复制而不是链接。)

答案 3 :(得分:5)

您可能会使用以下事实: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()