sys.stdout is not flushed

Dave Angel davea at ieee.org
Mon Nov 23 21:54:56 EST 2009



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




More information about the Python-list mailing list