In Python testsuite, setting stdout to unbuffered causes us to switch to ascii output locale
I had a failing test case which was producing UTF-8 output, and Python was choking on it trying to print it. I traced the problem to these lines of code in
sys.stdout.flush() if PYTHON3: # in Python 3, we output text, which cannot be unbuffered sys.stdout = os.fdopen(sys.__stdout__.fileno(), "w") else: # set stdout to unbuffered (is this the best way to do it?) sys.stdout = os.fdopen(sys.__stdout__.fileno(), "w", 0)
On Python 2.7.11 on Linux, with
LANG=en_US.UTF-8 in the environment, if you place a
print(u"\u2018") before these lines of code, Python will successfully print it; however, if you place it after, Python will crash:
Traceback (most recent call last): File "../../driver/runtests.py", line 279, in <module> print(u"\u2018") UnicodeEncodeError: 'ascii' codec can't encode character u'\u2018' in position 0: ordinal not in range(128)
So, I guess
fdopen resets the codec to
ascii, rather than whatever the locale detected. Drat!
I did some brief googling but I couldn't tell what the right way to rewrite this line of code is.