[Python-checkins] r75513 - in python/branches/py3k: Lib/test/regrtest.py Misc/NEWS

r.david.murray python-checkins at python.org
Mon Oct 19 17:26:17 CEST 2009


Author: r.david.murray
Date: Mon Oct 19 17:26:16 2009
New Revision: 75513

Log:
Merged revisions 75503 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r75503 | r.david.murray | 2009-10-18 17:12:37 -0400 (Sun, 18 Oct 2009) | 11 lines
  
  Issue #7151: regrtest would generate a JSON failure if there was output
  to stderr during the test run and it happened to get emitted after the
  worker thread emitted the result JSON.  Now we capture stdout and stderr
  separately, which avoids that problem.  It also means that _all_ stderr
  output is after all stdout output when we print the test results, but
  that seems acceptable, since output ordering is not guaranteed anyway.
  The patch also moves the emit of the test name into the output block
  generated after the test completes.  Otherwise test names and test
  output/errors were mixed in the terminal display, making it difficult
  to determine which test generated the output.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/test/regrtest.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/test/regrtest.py
==============================================================================
--- python/branches/py3k/Lib/test/regrtest.py	(original)
+++ python/branches/py3k/Lib/test/regrtest.py	Mon Oct 19 17:26:16 2009
@@ -464,38 +464,38 @@
                     try:
                         test, args_tuple = pending.popleft()
                     except IndexError:
-                        output.put((None, None, None))
+                        output.put((None, None, None, None))
                         return
-                    if not quiet:
-                        with print_lock:
-                            print(test)
-                            sys.stdout.flush()
                     # -E is needed by some tests, e.g. test_import
                     popen = Popen([sys.executable, '-E', '-m', 'test.regrtest',
                                    '--slaveargs', json.dumps(args_tuple)],
-                                   stdout=PIPE, stderr=STDOUT,
+                                   stdout=PIPE, stderr=PIPE,
                                    universal_newlines=True, close_fds=True)
-                    out = popen.communicate()[0].strip()
-                    out = debug_output_pat.sub("", out)
-                    out, _, result = out.strip().rpartition("\n")
+                    stdout, stderr = popen.communicate()
+                    # Strip last refcount output line if it exists, since it
+                    # comes from the shutdown of the interpreter in the subcommand.
+                    stderr = debug_output_pat.sub("", stderr)
+                    stdout, _, result = stdout.strip().rpartition("\n")
                     result = json.loads(result)
-                    output.put((test, out.strip(), result))
+                    if not quiet:
+                        stdout = test+'\n'+stdout
+                    output.put((test, stdout.rstrip(), stderr.rstrip(), result))
             except BaseException:
-                output.put((None, None, None))
+                output.put((None, None, None, None))
                 raise
         workers = [Thread(target=work) for i in range(use_mp)]
         for worker in workers:
             worker.start()
         finished = 0
         while finished < use_mp:
-            test, out, result = output.get()
-            if out:
-                with print_lock:
-                    print(out)
-                    sys.stdout.flush()
+            test, stdout, stderr, result = output.get()
             if test is None:
                 finished += 1
                 continue
+            if stdout:
+                print(stdout)
+            if stderr:
+                print(stderr, file=sys.stderr)
             if result[0] == -4:
                 assert result[1] == 'KeyboardInterrupt'
                 pending.clear()

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Mon Oct 19 17:26:16 2009
@@ -286,6 +286,9 @@
 Tests
 -----
 
+- Issue #7151: fixed regrtest -j so that output to stderr from a test no
+  longer runs the risk of causing the worker thread to fail.
+
 - Issue #7055: test___all__ now greedily detects all modules which have an
   __all__ attribute, rather than using a hardcoded and incomplete list.
 


More information about the Python-checkins mailing list