Стандартный буфер в python (как в python -u) изнутри программы
Возможный дубликат:
Выходная буферизация Python
Есть ли способ получить эффект запуска python -u из моего кода? В противном случае, может ли моя программа проверить, работает ли она в режиме -u, и завершить работу с сообщением об ошибке, если нет? Это на Linux (сервер Ubuntu 8.10)
4 ответа
Лучшее, что я мог придумать:
>>> 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
http://docs.python.org/library/functions.html
http://docs.python.org/library/os.html
[Редактировать]
Обратите внимание, что было бы лучше закрыть sys.stdout перед его перезаписью.
Вы всегда можете передать параметр -u в строку shebang:
#!/usr/bin/python -u
Предполагая, что вы на 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 скопирован из закомментированного решения, а не из ссылок.)
Вы можете использовать тот факт, что 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()