]> granicus.if.org Git - python/commitdiff
Issue #2304: Add additional quotes when using cmd shell on Windows. Original patch...
authorTim Golden <mail@timgolden.me.uk>
Sun, 8 Aug 2010 16:17:48 +0000 (16:17 +0000)
committerTim Golden <mail@timgolden.me.uk>
Sun, 8 Aug 2010 16:17:48 +0000 (16:17 +0000)
Lib/subprocess.py
Lib/test/test_subprocess.py

index ae033d47229de3140c7a282df11aa9f8a4b7ee88..760b2a9ac5381236541a173d9425be1eebd086e0 100644 (file)
@@ -853,7 +853,7 @@ class Popen(object):
                 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
index 95da10715012bf4fbafdf351199291f9e8ae3e2d..c4bef9e9b05768b4cd2356781b5fd9b03e762260 100644 (file)
@@ -1015,6 +1015,7 @@ class Win32ProcessTestCase(BaseTestCase):
         self._kill_process('terminate')
 
 
+
 # The module says:
 #   "NB This only works (and is only relevant) for UNIX."
 #
@@ -1041,6 +1042,46 @@ class CommandTests(unittest.TestCase):
             if dir is not None:
                 os.rmdir(dir)
 
+class CommandsWithSpaces (BaseTestCase):
+
+    def setUp(self):
+        super().setUp()
+        f, fname = 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"])
+
 
 @unittest.skipUnless(getattr(subprocess, '_has_poll', False),
                      "poll system call not supported")
@@ -1093,6 +1134,7 @@ def test_main():
                   Win32ProcessTestCase,
                   ProcessTestCasePOSIXPurePython,
                   CommandTests,
+                  CommandsWithSpaces,
                   ProcessTestCaseNoPoll,
                   HelperFunctionTests)