python print to stdout se perdendo em trabalhos de cluster com falha
Pergunta
Eu tenho um código python que estou executando em um cluster de computadores.A saída padrão (stdout
, de print
) se perde quando o código falha (ou é cancelado, etc.).Ele também não aparece no arquivo de saída quando eu o chamo imediatamente após a chamada da parte correspondente do código.
A saída de erro (stderr
), entretanto, é impresso quando a tarefa falha.Se bem me lembro, em c++ você pode flush
streams para garantir que a saída presa em um buffer em algum lugar seja realmente impressa.Existe um análogo para python?Como posso ter certeza de obter essa saída o mais rápido possível?
uma representação esquemática do meu código
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()
Depois de algumas iterações, terei vários arquivos de saída (de filename
), mas nenhuma saída no meu stdout
arquivo.Se a função otherStuff()
causassem uma falha (etc), saída Vai aparecer no meu stderr
arquivo - mas ainda nada no meu stdout
arquivo.
Solução
OK, então print
vai para sys.stdout que é um objeto de arquivo, para o qual você pode usar o flush()
comando.Então a resposta correta é adicionar flush()
liga quando necessário, ou seja,
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()