12

I was writing a simple program on Python 3.1 and I stumbled upon this:

If I run this on the IDLE it works as intended - prints "Initializing." and then adds two dots, one after each second, and waits for input.

from time import sleep

def initialize():
    print('Initializing.', end='')
    sleep(1)
    print(" .", end='')
    sleep(1)
    print(" .", end='')
    input()

initialize()

The problem is that when I double-click the .py to execute the file, it runs on python.exe instead of pythonw.exe, and strange things happen: it joins all the sleep() times i.e. makes me wait for 2 seconds, and then prints the whole string Initializing. . . at once. Why does this happen? Is there a way to avoid that happening in the terminal? It works fine if I use the IDLE in both windows and linux.

1
  • 2
    I imagine the reason it's buffering is because you haven't given it a \n yet. In general the use of end will indicate you're going on and writing something immediately. Commented Dec 16, 2010 at 3:25

2 Answers 2

24

This is because the output is being buffered.

You should add a sys.stdout.flush() after each write

Sign up to request clarification or add additional context in comments.

2 Comments

And, after 4 years, I just noticed I never actually set this as an accepted answer.
Using Python 3's print function, you can also use the flush parameter, e.g. print(" .", end='', flush=True)
5

It sounds like the difference is that stdout is automatically being flushed in IDLE. For efficiency, programming languages often save up a bunch of print calls before writing to the screen, which is a slow process.

Here's another question that has the answer you need: How to flush output of Python print?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.