Redirecionar a saída do programa para tela e arquivo simultaneamente

Redirecionar a saída do programa para tela e arquivo simultaneamente

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 nohupbackground ( &) ou redirecionamento). Curiosamente para mim, stdbuf -oLnão resolveu o problema. Mas acontece que tanto o Python 2 quanto o 3 (do qual subversões, não sei, desculpe), suportam uma -uopção que faz stdoute stderrsem 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 stdintambé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 teeque o OP já havia deduzido - ela só precisa de um python -ucomportamento mais familiar.

informação relacionada