Стандартный буфер в 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()
Другие вопросы по тегам