Eu tenho um programa python que está, lentamente, gerando alguma saída.
Quero capturar isso em um arquivo, mas também pensei que poderia assistir ao vivo com o tail.
Então, em um terminal estou fazendo:
python myprog.py > output.txt
e em outro terminal:
tail -f output.txt
Mas parece que o tail não está me mostrando nada enquanto o programa python está em execução.
Se eu apertar ctrl-c para encerrar o script python, de repente a cauda output.txt
começa a encher. Mas não enquanto o python estiver em execução.
O que estou fazendo de errado?
Responder1
Você também pode precisar liberar explicitamente o buffer para que ele seja canalizado na geração. Isso ocorre porque a saída normalmente só é impressa quando o buffer do pipe é preenchido (que está em kilobytes, acredito) e quando a mensagem stdin termina. Provavelmente isso é para economizar leitura/gravação. Você pode fazer isso após cada impressão ou, se estiver em loop, após a última impressão dentro do loop.
import sys
...
print('Some message')
sys.stdout.flush()
Responder2
Execute python com o sinalizador sem buffer:
python -u myprog.py > output.txt
A saída será impressa em tempo real.
Responder3
Em vez de tentar seguir um arquivo ativo, use tee
. Foi feito para fazer exatamente o que você está tentando fazer.
tee(1) - página de manual do Linux
Nome tee - lê da entrada padrão e grava na saída e nos arquivos padrão
Sinopse
tee [OPTION]... [FILE]...
Descrição
Copie a entrada padrão para cada ARQUIVO e também para a saída padrão.
-a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore interrupt signals --help display this help and exit --version output version information and exit
Se um FILE for -, copie novamente para a saída padrão.
Então, no seu caso, você executaria:
python myprog.py | tee output.txt
EDIT: Como outros apontaram, esta resposta terá o mesmo problema que o OP estava tendo originalmente, a menos que sys.stdout.flush()
seja usado no programa python conforme descrito na resposta aceita de Davey. Os testes que fiz antes de postar esta resposta não refletiram com precisão o caso de uso do OP.
tee
ainda pode ser usado como um método alternativo - embora menos que o ideal - de exibir a saída enquanto também grava no arquivo, mas a resposta de Davey é claramente a resposta correta e melhor.
Responder4
Quando uso tail, ele quase sempre rastreia um arquivo de log, por exemplo, mensagens (e-mail).
Isso pode ser um pouco estranho, mas em vez de usar print
// em seu código Python, por que print()
não write()
usar o módulo logging? (do PSL) NB: um formatador de registro pode ser configurado para NÃO gerar todos os códigos de tempo e ID associados a um registro tradicional.
A saída pode ser configurada para ir para um arquivo (dados) e, como não há atraso de buffer ou redirecionamento, tail funciona perfeitamente e com imediatismo.
Cumprimentos