sys.stdout is not flushed

Jankins andyjian430074 at gmail.com
Tue Nov 24 00:11:04 EST 2009


On Nov 23, 8:54 pm, Dave Angel <da... at ieee.org> wrote:
> Jankins wrote:
> > On Nov 23, 4:08 pm, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
>
> >> Jankins schrieb:
>
> >>> I am trying to use sys.stdout to print out "process-bar" like:
> >>> -->1%
>
> >>> Here is my program ‘test.py’:
>
> >>> from sys import stdout
> >>> for v in range(10):
> >>>     stdout.write('-->%d' % v)
> >>>     stdout.flush()
> >>> else:
> >>>     stdout.write('done!')
> >>> #end for
>
> >>> Then, I use 'python -u test.py' to run this script. But what I get
> >>> is :
> >>> -->0-->1-->2-->3-->4-->5-->6-->7-->8-->9done!
>
> >>> I am suppose to get 'done!'.
>
> >>> Can anybody help me about this?
>
> >> You misunderstand what "flush" means. It is not about clearing the
> >> screen, or the line.
>
> >> Try printing
>
> >>    stdout.write('\r-->%d')
>
> >> Diez
>
> > But there is still a problem. When you use control character '\r', you
> > actually move to the head of the current buffer line and overwrite it.
> > So if I use this way:
> > for i in range(100, 0,-1)
>
> > The tail of the buffer is not overwrote.
>
> > How to solve this problem?
>
> > Thanks.
>
> No idea what you mean by "buffer line."  This is moving the cursor
> around on the console.
>
> Anyway, for such a loop, just make sure all the strings are the same
> length.  Or just cheat and always write a few blanks at the end.
>
>        sys.stdout.write("\r -- %5d" % i)
>
> should do it, for up to 5 digit values
>
> DaveA

'%5d' is elegant. I prefer adding some space at the end of the output
string.
Thanks.



More information about the Python-list mailing list