]> granicus.if.org Git - python/commitdiff
Make test_subprocess pass. The subprocess module now reads and writes
authorGuido van Rossum <guido@python.org>
Tue, 15 May 2007 23:18:55 +0000 (23:18 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 15 May 2007 23:18:55 +0000 (23:18 +0000)
bytes instead of strings.  We'll see how long that lasts.

Lib/subprocess.py
Lib/test/test_subprocess.py

index 22de0ced4ac97e847de5c768d135c972dfc76fd8..2d02df65cae3e6bb4714559da809a87853c622b7 100644 (file)
@@ -830,7 +830,7 @@ class Popen(object):
             # object do the translation: It is based on stdio, which is
             # impossible to combine with select (unless forcing no
             # buffering).
-            if self.universal_newlines and hasattr(file, 'newlines'):
+            if self.universal_newlines:
                 if stdout:
                     stdout = self._translate_newlines(stdout)
                 if stderr:
@@ -1044,6 +1044,8 @@ class Popen(object):
 
 
         def _communicate(self, input):
+            if isinstance(input, str): # Unicode
+                input = input.encode("utf-8") # XXX What else?
             read_set = []
             write_set = []
             stdout = None # Return
@@ -1080,29 +1082,29 @@ class Popen(object):
 
                 if self.stdout in rlist:
                     data = os.read(self.stdout.fileno(), 1024)
-                    if data == "":
+                    if not data:
                         self.stdout.close()
                         read_set.remove(self.stdout)
                     stdout.append(data)
 
                 if self.stderr in rlist:
                     data = os.read(self.stderr.fileno(), 1024)
-                    if data == "":
+                    if not data:
                         self.stderr.close()
                         read_set.remove(self.stderr)
                     stderr.append(data)
 
             # All data exchanged.  Translate lists into strings.
             if stdout is not None:
-                stdout = ''.join(stdout)
+                stdout = b''.join(stdout)
             if stderr is not None:
-                stderr = ''.join(stderr)
+                stderr = b''.join(stderr)
 
             # Translate newlines, if requested.  We cannot let the file
             # object do the translation: It is based on stdio, which is
             # impossible to combine with select (unless forcing no
             # buffering).
-            if self.universal_newlines and hasattr(file, 'newlines'):
+            if self.universal_newlines:
                 if stdout:
                     stdout = self._translate_newlines(stdout)
                 if stderr:
index ce7b6598abdb5055e8fcfcd3e769df073c61b370..f87fc917adc9ca074d8203f1c6b02f4e946c1231 100644 (file)
@@ -24,7 +24,7 @@ else:
 # shutdown time.  That frustrates tests trying to check stderr produced
 # from a spawned Python process.
 def remove_stderr_debug_decorations(stderr):
-    return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
+    return re.sub(r"\[\d+ refs\]\r?\n?$", "", str8(stderr))
 
 class ProcessTestCase(unittest.TestCase):
     def setUp(self):
@@ -162,7 +162,7 @@ class ProcessTestCase(unittest.TestCase):
                          stdout=d)
         p.wait()
         os.lseek(d, 0, 0)
-        self.assertEqual(os.read(d, 1024), "orange")
+        self.assertEqual(os.read(d, 1024), b"orange")
 
     def test_stdout_fileobj(self):
         # stdout is set to open file object
@@ -300,7 +300,7 @@ class ProcessTestCase(unittest.TestCase):
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE)
         (stdout, stderr) = p.communicate("banana")
-        self.assertEqual(stdout, "banana")
+        self.assertEqual(stdout, b"banana")
         self.assertEqual(remove_stderr_debug_decorations(stderr),
                          "pineapple")
 
@@ -331,7 +331,7 @@ class ProcessTestCase(unittest.TestCase):
                          stdin=subprocess.PIPE,
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE)
-        string_to_write = "abc"*pipe_buf
+        string_to_write = b"abc"*pipe_buf
         (stdout, stderr) = p.communicate(string_to_write)
         self.assertEqual(stdout, string_to_write)
 
@@ -345,7 +345,7 @@ class ProcessTestCase(unittest.TestCase):
                          stderr=subprocess.PIPE)
         p.stdin.write("banana")
         (stdout, stderr) = p.communicate("split")
-        self.assertEqual(stdout, "bananasplit")
+        self.assertEqual(stdout, b"bananasplit")
         self.assertEqual(remove_stderr_debug_decorations(stderr), "")
 
     def test_universal_newlines(self):
@@ -365,14 +365,7 @@ class ProcessTestCase(unittest.TestCase):
                          stdout=subprocess.PIPE,
                          universal_newlines=1)
         stdout = p.stdout.read()
-        if hasattr(file, 'newlines'):
-            # Interpreter with universal newline support
-            self.assertEqual(stdout,
-                             "line1\nline2\nline3\nline4\nline5\nline6")
-        else:
-            # Interpreter without universal newline support
-            self.assertEqual(stdout,
-                             "line1\nline2\rline3\r\nline4\r\nline5\nline6")
+        self.assertEqual(stdout, "line1\nline2\nline3\nline4\nline5\nline6")
 
     def test_universal_newlines_communicate(self):
         # universal newlines through communicate()
@@ -392,13 +385,7 @@ class ProcessTestCase(unittest.TestCase):
                          stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                          universal_newlines=1)
         (stdout, stderr) = p.communicate()
-        if hasattr(file, 'newlines'):
-            # Interpreter with universal newline support
-            self.assertEqual(stdout,
-                             "line1\nline2\nline3\nline4\nline5\nline6")
-        else:
-            # Interpreter without universal newline support
-            self.assertEqual(stdout, "line1\nline2\rline3\r\nline4\r\nline5\nline6")
+        self.assertEqual(stdout, b"line1\nline2\nline3\nline4\nline5\nline6")
 
     def test_no_leaking(self):
         # Make sure we leak no resources
@@ -414,7 +401,7 @@ class ProcessTestCase(unittest.TestCase):
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
             data = p.communicate("lime")[0]
-            self.assertEqual(data, "lime")
+            self.assertEqual(data, b"lime")
 
 
     def test_list2cmdline(self):