Печать Python на стандартный вывод теряется при сбое заданий кластера
Вопрос
У меня есть код Python, который я запускаю в компьютерном кластере.Вывод по умолчанию (stdout
, от print
) теряется при сбое кода (или его отмене и т. д.).Он также не появляется в выходном файле, когда я вызываю его сразу после вызова соответствующей части кода.
Вывод ошибки (stderr
), однако распечатывается в случае сбоя задания.Если я правильно помню, в С++ вы можете flush
потоки, чтобы убедиться, что вывод, застрявший где-то в буфере, действительно печатается.Есть ли аналог для Python?Как я могу убедиться, что этот результат будет получен как можно скорее?
схематическое изображение моего кода
for it in somerange:
print "Iteration", it # This appears much later in stdout
f = open(filename[it], 'w')
f.write('stuff')
f.close # file appears when it is closed
otherStuff()
После нескольких итераций у меня будет множество выходных файлов (из filename
), но в моем нет вывода stdout
файл.Если функция otherStuff()
должны были вызвать сбой (и т. д.), вывод Воля появиться в моем stderr
файл - но в моем все еще ничего stdout
файл.
Решение
Хорошо, итак print
идет в sys.stdout который представляет собой файловый объект, для чего вы можете использовать flush()
команда.Итак, правильный ответ — добавить flush()
звонит, когда нужно, т.е.
import sys
...
for it in somerange:
print "Iteration", it # This appears much later in stdout
sys.stdout.flush()
f = open(filename[it], 'w')
f.write('stuff')
f.close # file appears when it is closed
otherStuff()