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.

Foi útil?

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top