Сбой линейной буферизации stdout на MINGW/MSYS Python 2.7.3

Проблема иллюстрируется этим простым скриптом:

import time, os, sys
sys.stdout = os.fdopen( sys.stdout.fileno(), 'w', 1 ) # line-buffer stdout
print 'before sleep'
time.sleep( 10 )
print 'after sleep'

Если буферизация строк выполнена успешно, между печатью двух строк будет 10-секундный интервал. В противном случае обе строки появятся практически одновременно после 10-секундной паузы (после запуска Python); то есть строки печатаются при выходе из программы.

В Linux я вижу линейную буферизацию как для файла, так и для экрана, если включена строка «sys.stdout». Без этой строки я вижу линейно-буферизованное поведение на экране, но не в файле. Это ожидаемо.

В среде MSYS/MINGW, если я опускаю строку «sys.stdout», я вижу то же поведение, что и в Linux: буферизация строк на экране, а не в файле.

Что странно, так это то, что с строкой "sys.stdout" я не вижу буферизации строк для ни экрана, ни файла. Я ожидаю увидеть это в обоих, как и в Linux.

Может ли кто-нибудь предложить обходной путь?

Вот еще немного информации:

uname -a MINGW32_NT-6.0 FOO 1.0.11(0.46/3/2) 23 мая 2009 г. 19:33 i686 Msys

Спасибо, -В.


person wchlm    schedule 15.01.2013    source источник


Ответы (1)


Один из моих коллег знал ответ.

Буферизация строк не поддерживается в WIN32. Если указана буферизация строк, она возвращается к полной буферизации. Доступен небуферизованный вывод, и обходной путь — использовать его на WIN32. Я попробовал это в своей простой тестовой программе, и она работает.

Ссылка: http://msdn.microsoft.com/en-us/library/86cebhfs%28v=vs.71%29.aspx

person wchlm    schedule 16.01.2013