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