Skip to content

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 testsuite/driver/runtests.py:

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.

Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Test Suite
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
Edited by Edward Z. Yang
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information