Buffering of sys.stdout and sys.stderr in python3 (and documentation)

Geoff Bache geoff.bache at gmail.com
Fri Dec 9 14:32:29 EST 2011


Hi all,

Short version:

I'm a bit confused in general as to the changes between python2 and
python3 regarding how standard output and standard error do buffering.
A few things seem to have changed and I've failed to find any
documentation of how and why. Also, the meaning of "python -u" seems
to have changed and the docs don't seem to reflect the new behaviour
(and I can't find any docs about the change either)...

Long version:

>From rude experiment it seems that:
1) In Python 2.x, standard error was always unbuffered while standard
output was buffered by default.  In python3, both are buffered. In
both cases, "buffered" means line-buffered when writing to the console
and not line-buffered when redirected to files.
2) In Python 2.x, the "-u" flag meant everything was totally
unbuffered. In Python 3.x, it means that both stdout and stderr are
line-buffered also when redirected to files.

Are either of these changes documented anywhere? (1) seems important :
it can lead to not seeing exception printouts, if stderr is redirected
to a file and the program is subsequently terminated with SIGTERM. I
just wasted quite a bit of time due to this situation...

This is what the Python 3 docs have to say about the -u flag:

"Force the binary layer of the stdin, stdout and stderr streams (which
is available as their buffer attribute) to be unbuffered. The text I/O
layer will still be line-buffered."

The "still" seems misleading to me, as it is only relevant if writing
to the console. It would be useful to contrast the behaviour with and
without "-u" when writing to files I would say.

Regards,
Geoff Bache



More information about the Python-list mailing list