Instruções de impressão em tempo real com o tee no script interativo

3

Eu tenho um programa long_interactive_script.py que tem milhares de print declarações. Eu quero canalizar o programa através de tee (ou uma alternativa) para que eu possa salvar a saída.

Se eu fizer

long_interactive_script.py | tee logfile.txt

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

nothing, nothing, nothing, nothing, a whole lot of text!, nothing, nothing, a sudo prompt in the middle of a word, nothing, nothing, a whole lot of text!

Em uma tentativa de evitar o buffer, tentei:

unbuffer long_interactive_script.py | tee logfile.txt

Mas isso faz com que meu script pare de ser interativo. Então, quando o script entra em um prompt sudo , ele pára.

Nota: não é possível executar sudo ANTES de executar o script. O script interativo requer apenas sudo em algumas execuções, e eu não quero pedir sudo quando não for necessário.

Mais ...

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

funciona até certo ponto. Eu 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.
    
por Sunny 23.09.2016 / 16:12

2 respostas

1

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

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
    
por 23.09.2016 / 20:16
1

Não há soluções alternativas para o armazenamento em buffer, e é por isso que outras pessoas usam script , que captura todos os caracteres gravados no terminal sem interferir nos prompts interativos.

O arquivo typescript resultante é um pouco mais feio do que apenas redirecionar para a saída padrão, mas (supondo que seu aplicativo fornecesse informações úteis nesse modo), bastaria apenas aparar caracteres de retorno de carro.

Além de apenas retornos de carro, há caracteres de edição para filtrar. Veja por exemplo:

por 23.09.2016 / 20:25