Potrebbe anche essere necessario svuotare in modo esplicito il buffer affinché venga reindirizzato al momento della generazione. Questo perché l'output viene in genere stampato solo quando il buffer della pipe si riempie (che è in kilobyte credo) e quando il messaggio stdin termina. Questo è probabilmente per risparmiare in lettura/scrittura. Puoi farlo dopo ogni stampa o, se stai eseguendo un ciclo, dopo l'ultima stampa all'interno del ciclo.
import sys
...
print('Some message')
sys.stdout.flush()
Esegui python con il flag unbuffered:
python -u myprog.py > output.txt
L'output verrà quindi stampato in tempo reale.
Invece di cercare di eseguire la coda di un file live, usa tee
invece. È stato creato per fare esattamente quello che stai cercando di fare.
Da uomo tee:
tee(1) - Pagina man di Linux
Nome tee - legge dallo standard input e scrive sullo standard output e sui file
Sinossi
tee [OPTION]... [FILE]...
Descrizione
Copia lo standard input in ogni FILE e anche nello standard output.
-a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore interrupt signals --help display this help and exit --version output version information and exit
Se un FILE è -, copialo di nuovo sullo standard output.
Quindi nel tuo caso eseguiresti:
python myprog.py | tee output.txt
EDIT:come altri hanno sottolineato, questa risposta incontrerà lo stesso problema che OP aveva originariamente a meno che sys.stdout.flush()
è usato nel programma Python come descritto nella risposta accettata di Davey. I test che ho eseguito prima di pubblicare questa risposta non riflettevano accuratamente il caso d'uso di OP.
tee
può ancora essere utilizzato come metodo alternativo, anche se non ottimale, per visualizzare l'output mentre si scrive anche sul file, ma la risposta di Davey è chiaramente la risposta corretta e migliore.