Печать Python на стандартный вывод теряется при сбое заданий кластера

StackOverflow https://stackoverflow.com//questions/23025562

Вопрос

У меня есть код 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top