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)