Watching something be written to a file live with tail
You may also need to explicitly flush the buffer for it to get piped upon generation. This is because output is typically only printed when the pipe's buffer fills up (which is in kilobytes I belive), and when the stdin message ends. This is probably to save on read/writes. You could do this after every print, or if you are looping, after the last print within the loop.
import sys
...
print('Some message')
sys.stdout.flush()
Run python with the unbuffered flag:
python -u myprog.py > output.txt
Output will then print in real time.
Instead of trying to tail a live file, use tee
instead. It was made to do exactly what you're trying to do.
From man tee:
tee(1) - Linux man page
Name tee - read from standard input and write to standard output and files
Synopsis
tee [OPTION]... [FILE]...
Description
Copy standard input to each FILE, and also to 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
If a FILE is -, copy again to standard output.
So in your case you'd run:
python myprog.py | tee output.txt
EDIT: As others have pointed out, this answer will run into the same issue OP was originally having unless sys.stdout.flush()
is used in the python program as described in Davey's accepted answer. The testing I did before posting this answer did not accurately reflect OP's use-case.
tee
can still be used as an alternative--albeit less than optimal--method of displaying the output while also writing to the file, but Davey's answer is clearly the correct and best answer.