diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2017-10-13 20:42:27 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2017-10-13 20:42:27 (GMT) |
commit | 6234e9068332f61f935cf13fa5b1a924a99c28b2 (patch) | |
tree | b1da80d2896ac67e5b1015dd5717fa4f98277a9c | |
parent | fdf151bbfbd5aed7c860ff212faf711a270544f3 (diff) | |
download | cpython-6234e9068332f61f935cf13fa5b1a924a99c28b2.zip cpython-6234e9068332f61f935cf13fa5b1a924a99c28b2.tar.gz cpython-6234e9068332f61f935cf13fa5b1a924a99c28b2.tar.bz2 |
[3.6] bpo-25588: Fix regrtest when run inside IDLE (GH-3962) (#3987)
When regrtest in run inside IDLE, sys.stdout and sys.stderr are not
TextIOWrapper objects and have no file descriptor associated:
sys.stderr.fileno() raises io.UnsupportedOperation.
Disable faulthandler and don't replace sys.stdout in that case.
(cherry picked from commit ccef823939d4ef602f2d8d13d0bfec29eda597a5)
-rw-r--r-- | Lib/test/libregrtest/setup.py | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 1d24531..bf899a9 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -14,17 +14,26 @@ from test.libregrtest.refleak import warm_caches def setup_tests(ns): - # Display the Python traceback on fatal errors (e.g. segfault) - faulthandler.enable(all_threads=True) - - # Display the Python traceback on SIGALRM or SIGUSR1 signal - signals = [] - if hasattr(signal, 'SIGALRM'): - signals.append(signal.SIGALRM) - if hasattr(signal, 'SIGUSR1'): - signals.append(signal.SIGUSR1) - for signum in signals: - faulthandler.register(signum, chain=True) + try: + stderr_fd = sys.__stderr__.fileno() + except (ValueError, AttributeError): + # Catch ValueError to catch io.UnsupportedOperation on TextIOBase + # and ValueError on a closed stream. + # + # Catch AttributeError for stderr being None. + stderr_fd = None + else: + # Display the Python traceback on fatal errors (e.g. segfault) + faulthandler.enable(all_threads=True, file=stderr_fd) + + # Display the Python traceback on SIGALRM or SIGUSR1 signal + signals = [] + if hasattr(signal, 'SIGALRM'): + signals.append(signal.SIGALRM) + if hasattr(signal, 'SIGUSR1'): + signals.append(signal.SIGUSR1) + for signum in signals: + faulthandler.register(signum, chain=True, file=stderr_fd) replace_stdout() support.record_original_stdout(sys.stdout) @@ -109,7 +118,17 @@ def replace_stdout(): """Set stdout encoder error handler to backslashreplace (as stderr error handler) to avoid UnicodeEncodeError when printing a traceback""" stdout = sys.stdout - sys.stdout = open(stdout.fileno(), 'w', + try: + fd = stdout.fileno() + except ValueError: + # On IDLE, sys.stdout has no file descriptor and is not a TextIOWrapper + # object. Leaving sys.stdout unchanged. + # + # Catch ValueError to catch io.UnsupportedOperation on TextIOBase + # and ValueError on a closed stream. + return + + sys.stdout = open(fd, 'w', encoding=stdout.encoding, errors="backslashreplace", closefd=False, |