
Eu tenho um programa long_interactive_script.py
que tem milhares de print
instruçõ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 sudo
ANTES de executar o script. O script interativo requer apenas sudo
algumas execuções e não quero perguntar sudo
quando 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 -u
sinalizador 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: