[Python-checkins] r83831 - in python/branches/release31-maint/Lib: subprocess.py test/test_subprocess.py

tim.golden python-checkins at python.org
Sun Aug 8 18:18:18 CEST 2010


Author: tim.golden
Date: Sun Aug  8 18:18:18 2010
New Revision: 83831

Log:
Issue #2304: Add additional quotes when using cmd shell on Windows. Original patch from Gabriel Genellina

Modified:
   python/branches/release31-maint/Lib/subprocess.py
   python/branches/release31-maint/Lib/test/test_subprocess.py

Modified: python/branches/release31-maint/Lib/subprocess.py
==============================================================================
--- python/branches/release31-maint/Lib/subprocess.py	(original)
+++ python/branches/release31-maint/Lib/subprocess.py	Sun Aug  8 18:18:18 2010
@@ -829,7 +829,7 @@
                 startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
                 startupinfo.wShowWindow = _subprocess.SW_HIDE
                 comspec = os.environ.get("COMSPEC", "cmd.exe")
-                args = comspec + " /c " + args
+                args = comspec + " /c " + '"%s"' % args
                 if (_subprocess.GetVersion() >= 0x80000000 or
                         os.path.basename(comspec).lower() == "command.com"):
                     # Win9x, or using command.com on NT. We need to

Modified: python/branches/release31-maint/Lib/test/test_subprocess.py
==============================================================================
--- python/branches/release31-maint/Lib/test/test_subprocess.py	(original)
+++ python/branches/release31-maint/Lib/test/test_subprocess.py	Sun Aug  8 18:18:18 2010
@@ -28,7 +28,7 @@
     return re.sub("\[\d+ refs\]\r?\n?$", "", stderr.decode()).encode()
     #return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
 
-class ProcessTestCase(unittest.TestCase):
+class BaseTestCase(unittest.TestCase):
     def setUp(self):
         # Try to minimize the number of children we have so this test
         # doesn't crash on some buildbots (Alphas in particular).
@@ -41,14 +41,15 @@
         if hasattr(support, "reap_children"):
             support.reap_children()
 
-    def mkstemp(self):
+    def mkstemp(self, *args, **kwargs):
         """wrapper for mkstemp, calling mktemp if mkstemp is not available"""
         if hasattr(tempfile, "mkstemp"):
-            return tempfile.mkstemp()
+            return tempfile.mkstemp(*args, **kwargs)
         else:
-            fname = tempfile.mktemp()
+            fname = tempfile.mktemp(*args, **kwargs)
             return os.open(fname, os.O_RDWR|os.O_CREAT), fname
 
+class ProcessTestCase(BaseTestCase):
     #
     # Generic tests
     #
@@ -863,6 +864,7 @@
             p.terminate()
             self.assertNotEqual(p.wait(), 0)
 
+
 class CommandTests(unittest.TestCase):
 # The module says:
 #   "NB This only works (and is only relevant) for UNIX."
@@ -893,6 +895,50 @@
 
 unit_tests = [ProcessTestCase, CommandTests]
 
+if mswindows:
+    class CommandsWithSpaces (BaseTestCase):
+
+        def setUp(self):
+            super().setUp()
+            f, fname = self.mkstemp(".py", "te st")
+            self.fname = fname.lower ()
+            os.write(f, b"import sys;"
+                        b"sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))"
+            )
+            os.close(f)
+
+        def tearDown(self):
+            os.remove(self.fname)
+            super().tearDown()
+
+        def with_spaces(self, *args, **kwargs):
+            kwargs['stdout'] = subprocess.PIPE
+            p = subprocess.Popen(*args, **kwargs)
+            self.assertEqual(
+              p.stdout.read ().decode("mbcs"),
+              "2 [%r, 'ab cd']" % self.fname
+            )
+
+        def test_shell_string_with_spaces(self):
+            # call() function with string argument with spaces on Windows
+            self.with_spaces('"%s" "%s"' % (self.fname, "ab cd"), shell=1)
+
+        def test_shell_sequence_with_spaces(self):
+            # call() function with sequence argument with spaces on Windows
+            self.with_spaces([self.fname, "ab cd"], shell=1)
+
+        def test_noshell_string_with_spaces(self):
+            # call() function with string argument with spaces on Windows
+            self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
+                                 "ab cd"))
+
+        def test_noshell_sequence_with_spaces(self):
+            # call() function with sequence argument with spaces on Windows
+            self.with_spaces([sys.executable, self.fname, "ab cd"])
+
+    unit_tests.append(CommandsWithSpaces)
+
+
 if getattr(subprocess, '_has_poll', False):
     class ProcessTestCaseNoPoll(ProcessTestCase):
         def setUp(self):


More information about the Python-checkins mailing list