Unbuffered stderr in Python 3
Nobody
nobody at nowhere.invalid
Tue Nov 3 02:10:58 EST 2015
On Mon, 02 Nov 2015 18:52:55 +1100, Steven D'Aprano wrote:
> In Python 2, stderr is unbuffered.
>
> In most other environments (the shell, C...) stderr is unbuffered.
>
> It is usually considered a bad, bad thing for stderr to be buffered. What
> happens if your application is killed before the buffer fills up? The
> errors in the buffer will be lost.
>
> So how come Python 3 has line buffered stderr? And more importantly, how
> can I turn buffering off?
It's probably related to the fact that std{in,out,err} are Unicode
streams.
> type(sys.stderr)
<class '_io.TextIOWrapper'>
> type(sys.stderr.buffer)
<class '_io.BufferedWriter'>
> type(sys.stderr.buffer.raw)
<class '_io.FileIO'>
It appears that you can turn it off with:
sys.stderr = io.TextIOWrapper(sys.stderr.buffer.raw)
or:
sys.stderr = io.TextIOWrapper(sys.stderr.detach().detach())
This results in a sys.stderr which appears to work and whose
.line_buffering property is False.
More information about the Python-list
mailing list