]> granicus.if.org Git - python/commitdiff
[3.6] bpo-25588: Fix regrtest when run inside IDLE (GH-3962) (#3987)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 13 Oct 2017 20:42:27 +0000 (13:42 -0700)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 13 Oct 2017 20:42:27 +0000 (13:42 -0700)
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)

Lib/test/libregrtest/setup.py

index 1d24531fc26ec544e5f15e3e5cb89e94544b1009..bf899a9e4d4ac1a042f64968f9e34a1e0bcfc457 100644 (file)
@@ -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,