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)
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.
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)
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: