Assistindo algo ser gravado em um arquivo ao vivo com tail

Assistindo algo ser gravado em um arquivo ao vivo com tail

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.txtcomeç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.

Decamiseta masculina:

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.

teeainda 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

informação relacionada