[Python-checkins] r80413 - in python/branches/py3k: Lib/subprocess.py Lib/test/test_subprocess.py Misc/NEWS

victor.stinner python-checkins at python.org
Fri Apr 23 21:28:32 CEST 2010


Author: victor.stinner
Date: Fri Apr 23 21:28:32 2010
New Revision: 80413

Log:
Issue #8467: Pure Python implementation of subprocess encodes the error message
using surrogatepass error handler to support surrogates in the message


Modified:
   python/branches/py3k/Lib/subprocess.py
   python/branches/py3k/Lib/test/test_subprocess.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/subprocess.py
==============================================================================
--- python/branches/py3k/Lib/subprocess.py	(original)
+++ python/branches/py3k/Lib/subprocess.py	Fri Apr 23 21:28:32 2010
@@ -1204,8 +1204,9 @@
                                         errno = 0
                                     message = '%s:%x:%s' % (exc_type.__name__,
                                                             errno, exc_value)
-                                    os.write(errpipe_write, message.encode())
-                                except:
+                                    message = message.encode(errors="surrogatepass")
+                                    os.write(errpipe_write, message)
+                                except Exception:
                                     # We MUST not allow anything odd happening
                                     # above to prevent us from exiting below.
                                     pass
@@ -1255,7 +1256,7 @@
                 for fd in (p2cwrite, c2pread, errread):
                     if fd != -1:
                         os.close(fd)
-                err_msg = err_msg.decode()
+                err_msg = err_msg.decode(errors="surrogatepass")
                 if issubclass(child_exception_type, OSError) and hex_errno:
                     errno = int(hex_errno, 16)
                     if errno != 0:

Modified: python/branches/py3k/Lib/test/test_subprocess.py
==============================================================================
--- python/branches/py3k/Lib/test/test_subprocess.py	(original)
+++ python/branches/py3k/Lib/test/test_subprocess.py	Fri Apr 23 21:28:32 2010
@@ -782,6 +782,25 @@
         self.assertStderrEqual(stderr, b'')
         self.assertEqual(p.wait(), -signal.SIGTERM)
 
+    def test_surrogates(self):
+        def prepare():
+            raise ValueError("surrogate:\uDCff")
+
+        try:
+            subprocess.call(
+                [sys.executable, "-c", "pass"],
+                preexec_fn=prepare)
+        except ValueError as err:
+            # Pure Python implementations keeps the message
+            self.assertIsNone(subprocess._posixsubprocess)
+            self.assertEqual(str(err), "surrogate:\uDCff")
+        except RuntimeError as err:
+            # _posixsubprocess uses a default message
+            self.assertIsNotNone(subprocess._posixsubprocess)
+            self.assertEqual(str(err), "Exception occurred in preexec_fn.")
+        else:
+            self.fail("Expected ValueError or RuntimeError")
+
 
 @unittest.skipUnless(mswindows, "Windows specific tests")
 class Win32ProcessTestCase(BaseTestCase):

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Fri Apr 23 21:28:32 2010
@@ -333,6 +333,10 @@
 Library
 -------
 
+- Issue #8467: Pure Python implementation of subprocess encodes the error
+  message using surrogatepass error handler to support surrogates in the
+  message
+
 - Issue #8468: bz2.BZ2File() accepts str with surrogates and bytes filenames
 
 - Issue #8451: Syslog module now uses basename(sys.argv[0]) instead of


More information about the Python-checkins mailing list