[Python-ideas] Replacing the standard IO streams (was Re: changing sys.stdout encoding)

Paul Moore p.f.moore at gmail.com
Sat Jun 9 15:00:03 CEST 2012


On 9 June 2012 12:00, Paul Moore <p.f.moore at gmail.com> wrote:
> On 9 June 2012 10:55, Nick Coghlan <ncoghlan at gmail.com> wrote:
>> So, after much digging, it appears the *right* way to replace a
>> standard stream in Python 3 after application start is to do the
>> following:
>>
>>    sys.stdin = open(sys.stdin.fileno(), 'r', <new settings>)
>>    sys.stdout = open(sys.stdout.fileno(), 'w', <new settings>)
>>    sys.stderr = open(sys.stderr.fileno(), 'w', <new settings>)
>>
>> Ditto for the other standard streams. It seems it already *is* as
>> simple as with any other file, we just collectively forgot about:
>
> One minor point - if sys.stdout is redirected, *and* you have already
> written to sys.stdout, this resets the file pointer. With test.py as
>
> import sys
> print("Hello!")
> sys.stdout = open(sys.stdout.fileno(), 'w', encoding='utf-8')
> print("Hello!")
>
> test.py >a gives one line in a, not two (tested on Windows, Unix may
> be different). And changing to "a" doesn't resolve this...

Ignore me - you need to flush stdout before repoening it, is all. Dumb
mistake, sorry for the noise :-(

Paul.



More information about the Python-ideas mailing list