Tenho um script Python test.py
que escreve 100 linhas, uma por segundo:
from time import sleep
for i in range(100):
print(f'line {i}')
sleep(1)
Gostaria de redirecionar a saída para log.txt
o arquivo sem buffer, ou seja, a cada segundo uma linha é acrescentada ao arquivo.
Tentei:
python3 test.py > log.txt
python3 test.py | tee log.txt
stdbuf -oL python3 test.py > log.txt
script -c "python3 test.py" log.tx
Nenhuma dessas opções grava log.txt
linha por linha enquanto test.py
está em execução. Toda a saída é despejada na conclusão ou interrupção do programa. Qual é a solução?
O programa em si deve ser alterado para não armazenar em buffer – ou para liberar os dados armazenados em buffer com mais frequência.
-u
opção,sys.stdout.reconfigure(line_buffering=True)
,print(..., flush=True)
,sys.stdout.flush()
após cada impressão.Quando
stdbuf -oL
usado, ele injeta código que reconfigura o 'stdout' do Glibc de maneira semelhante, mas afeta apenasFILE*
o buffer do Glibc (ou seja, do código C), mas não o equivalente em Python.