Eu tenho um script Python. Quero salvar o resultado enquanto ele gera algo no terminal. tentei
python program.py 2>&1 | tee output.txt
Porém, parece que só depois que o programa terminar ele imprimirá tudo na tela. Enquanto está em execução, não há saída. Isso realmente me incomoda porque quero saber o progresso durante a execução do programa. Existe alguma maneira de enviar para tela e arquivo simultaneamente?
Atualização em 13 de novembro de 2019
Obrigado pela ajuda @egmont. Qualquer pessoa que esteja enfrentando o mesmo problema pode tentar os seguintes comandos. Ele será exibido na tela e gravado no arquivo simultaneamente.
stdbuf -oL python program.py 2>&1 | tee ouput.txt
Responder1
Eu estava enfrentando o mesmo problema ("qualquer coisa" que envolvesse manipulação stdout
- como nohup
background ( &
) ou redirecionamento). Curiosamente para mim, stdbuf -oL
não resolveu o problema. Mas acontece que tanto o Python 2 quanto o 3 (do qual subversões, não sei, desculpe), suportam uma -u
opção que faz stdout
e stderr
sem buffer. Verhttps://www.commandlinux.com/man-page/man1/python2.7.1.html.
Acabei de notar (de acordo com a página de manual) que no Python 2.7 stdin
também é feito sem buffer, enquanto a página de manual do Python 3 (3.10 para mim) diz especificamente"This option has no effect on the stdin stream."
Então, o comando original do OP seria:
python -u program.py 2>&1 | tee output.txt
Eu então obtenho o comportamento que esperaria com PHP/awk/etc.
Como o OP solicitou "Existe alguma maneira de gerar saída para tela e arquivo simultaneamente?", Esta "solução" depende do tee
que o OP já havia deduzido - ela só precisa de um python -u
comportamento mais familiar.