Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with sys.stdout.write() with time.sleep() in a function

What I wanted is printing out 5 dots that a dot printed per a second using time.sleep(), but the result was 5 dots were printed at once after 5 seconds delay.
Tried both print and sys.stdout.write, same result.

Thanks for any advices.

import time
import sys

def wait_for(n):
    """Wait for {n} seconds. {n} should be an integer greater than 0."""
    if not isinstance(n, int):
        print 'n in wait_for(n) should be an integer.'
        return
    elif n < 1:
        print 'n in wait_for(n) should be greater than 0.'
        return
    for i in range(0, n):
        sys.stdout.write('.')
        time.sleep(1)
    sys.stdout.write('\n')

def main():
    wait_for(5)    # FIXME: doesn't work as expected

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print '\nAborted.'
like image 756
philipjkim Avatar asked May 11 '10 07:05

philipjkim


2 Answers

You need to flush after writing.

sys.stdout.write('foo')
sys.stdout.flush()
wastetime()
sys.stdout.write('bar')
sys.stdout.flush()
like image 194
Ignacio Vazquez-Abrams Avatar answered Oct 16 '22 14:10

Ignacio Vazquez-Abrams


You should use sys.stderr.write for progress bars; stderr has the (not at all coincidental) advantage of not being buffered, so no sys.stderr.flush calls are needed.

See also this answer.

like image 24
tzot Avatar answered Oct 16 '22 14:10

tzot