6

I'm running python version 2.7.3 on MacOSX.

Consider this block of code:

from __future__ import print_function
import time
x = 0
while x < 5:
    print(x)
    x += 1
    time.sleep(1)

If I run this script, I observe the output I expect: The numbers 0 through 4 with a \n character appended to each number. Futhermore, each number displays after a one second pause.

0
1
2
3
4

Now consider this code block:

from __future__ import print_function
import time
x = 0
while x < 5:
    print(x, end='')
    x += 1
    time.sleep(1)

The output is what I expect, 01234 without the \n's, but the timing is unexpected. Rather than displaying each digit after a one-second pause, the process waits four seconds, then displays all five numbers.

Why does print('string') behave differently from print('string', end='') in while-loops? Is there any way to display the characters without newlines, one second at a time? I tried sys.stdout.write(str(x)), but it behaves the same way as print(end='').

Christopher
  • 42,720
  • 11
  • 81
  • 99

2 Answers2

19

Because the output stream is line-buffered - since it's not explicitly being flushed in between print statements, it waits until it sees a newline to flush the output.

You can force flushing via sys.stdout.flush().

Alternatively if you run Python with the -u flag, it will disable line buffering.

Amber
  • 507,862
  • 82
  • 626
  • 550
7

This is just python buffering stdout. This answer has some more info.

You can flush it like this:

import sys
from __future__ import print_function
import time
x = 0
while x < 5:
    print(x, end='')
    x += 1
    sys.stdout.flush()
    time.sleep(1)

Alternatively start python python -u and it won't be buffered.

Community
  • 1
  • 1
Andrew Barrett
  • 19,721
  • 4
  • 47
  • 52