Unbuffered stdout в python (как в python -u) из программы

Возможный дубликат:
Буферизация вывода на Python

Есть ли способ получить эффект запуска python -u из моего кода? В противном случае, может ли моя программа проверить, работает ли она в режиме -u и выйти с сообщением об ошибке, если нет? Это на linux (сервер ubuntu 8.10)

Ответ 1

Лучшее, что я мог придумать:

>>> 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 перед его перезаписью.

Ответ 2

Вы всегда можете передать параметр -u в строке shebang:

#!/usr/bin/python -u

Ответ 3

Вы можете использовать тот факт, что 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

Предполагая, что вы находитесь в Windows:

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