summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2017-10-13 20:42:27 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2017-10-13 20:42:27 (GMT)
commit6234e9068332f61f935cf13fa5b1a924a99c28b2 (patch)
treeb1da80d2896ac67e5b1015dd5717fa4f98277a9c
parentfdf151bbfbd5aed7c860ff212faf711a270544f3 (diff)
downloadcpython-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.py43
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,