Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Re: autoflush on/off (http://www.velocityreviews.com/forums/t957267-re-autoflush-on-off.html)

Terry Reedy 02-04-2013 09:13 PM

Re: autoflush on/off
 
On 2/4/2013 12:12 PM, Jabba Laci wrote:
> Hi,
>
> I'd like to set autoflush on/off in my script. I have a loop that is
> checking something and every 5 second I want to print a '.' (dot). I
> do it with sys.stdout.write and since there is no newline, it is
> buffered and not visible immediately. I have this solution to use
> unbuffered output:
>
> autoflush_on = False
>
> def unbuffered():
> """Switch autoflush on."""
> global autoflush_on
> # reopen stdout file descriptor with write mode
> # and 0 as the buffer size (unbuffered)
> if not autoflush_on:
> sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
> autoflush_on = True
>
> I call unbuffered() once and it works well. However, when this loop is
> over, I'd like to set the output back to buffered. How to do that? As
> far as I remember, in Perl it was simply $| = 1 and $| = 0. Can it
> also be switched back and forth in Python?


Write a context manager class. See Library manual, 4.11. Context Manager
Types. The __enter__ method would be much like the above except that is
should save the old stdout object 'oldstdout = sys.stdout' instead of
fiddling with 'autoflush_on'. Then __exit__ would simply be 'sys.stdout
= oldstdout'. Drop autoflush_on. Your context manager should not care
about the existing buffering other than to restore it on exit. Saving
and restoring the existing stdout object does that.

--
Terry Jan Reedy



All times are GMT. The time now is 07:20 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.