Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python sys.stderr flush frequency

How often does sys.stderr flush its buffer, and is this standard among different environments?

>>> import sys
>>> sys.__stderr__
<open file '<stderr>', mode 'w' at 0x2b4fcb7ac270>

I see that it is just a standard file type, but I don't know what value of buffering it's supposed to be. dir() does not seem to yield any useful information either.

like image 816
Brian Avatar asked Mar 18 '14 05:03

Brian


People also ask

Is stderr flushed?

The C standard makes no guarantees as to when output to stdout (standard output) or stderr (standard error) is actually flushed. On many platforms, output to stdout is buffered unless stdout outputs to a terminal, and stderr output is typically not buffered.

What is SYS stdout flush () in Python?

stdout. flush() forces it to “flush” the buffer, meaning that it will write everything in the buffer to the terminal, even if normally it would wait before doing so. The sys module provides functions and variables used to manipulate different parts of the Python runtime environment.


1 Answers

Update: sys.stderr is line-buffered by default since Python 3.9. If python receives -u command-line option or $PYTHONUNBUFFERED environment variable is set, then stdout and stderr streams are forced to be unbuffered (including text layer since Python 3.7).


old answer:

On Python 2, I can't find where in the documentation sys.stderr's buffering is specified. I'd expect the same behaviour as stderr in C that is unbuffered (except Windows) and I don't know whether c99 standard mandates it. The standard error stream is not fully buffered in POSIX. -u option forces standard streams to be unbuffered in Python 2.

On Python 3:

When interactive, standard streams are line-buffered. Otherwise, they are block-buffered like regular text files. You can override this value with the -u command-line option.

-u command-line option:

Force the binary layer of the stdout and stderr streams (which is available as their buffer attribute) to be unbuffered. The text I/O layer will still be line-buffered if writing to the console, or block-buffered if redirected to a non-interactive file.

like image 56
jfs Avatar answered Sep 21 '22 21:09

jfs