Declarações impressas em tempo real com tee em script interativo

Declarações impressas em tempo real com tee em script interativo

Eu tenho um programa long_interactive_script.pyque tem milhares de printinstruções. Quero canalizar o programa tee(ou uma alternativa) para poder salvar a saída.

Se eu fizer

long_interactive_script.py | tee logfile.txt

Python coloca suas instruções de impressão em um buffer de 4K, fazendo com que eu obtenha:

nada, nada, nada, nada, muito texto!, nada, nada, um prompt sudo no meio de uma palavra, nada, nada, muito texto!

Na tentativa de evitar o buffer, tentei:

unbuffer long_interactive_script.py | tee logfile.txt

Mas isso faz com que meu script deixe de ser interativo. Então, quando o script se transforma em umsudoprompt, ele para.

Nota: não consigo simples sudoANTES de executar o script. O script interativo requer apenas sudoalgumas execuções e não quero perguntar sudoquando não for necessário.

Mais...

stdbuf -oL long_interactive_script.py | tee -a logfile.txt

funciona até certo ponto. Recebo todos os dados desejados, mas também recebo este erro:

ERROR: ld.so: object '/usr/lib64/coreutils/libstdbuf.so' from LD_PRELOAD cannot be preloaded: ignored.

Responder1

Especifique um buffer de tamanho zero para o fluxo de saída padrão do Python. Você pode fazer isso invocando Python com o -usinalizador ou com a seguinte instrução.

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Responder2

Apesar das soluções alternativas para buffer, é por isso que outros usamscript, que captura todos os caracteres gravados no terminal sem interferir nos prompts interativos.

O arquivo resultante typescripté um pouco mais feio do que apenas redirecionar para a saída padrão, mas (assumindo que seu aplicativo estava fornecendo informações úteis nesse modo), apenas cortar os caracteres de retorno de carro será suficiente.

Além dos retornos de carro, existem caracteres de edição para filtrar. Veja por exemplo:

informação relacionada