]> 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:18:45 +0000 (16:18 +0000)
committerTim Golden <mail@timgolden.me.uk>
Sun, 8 Aug 2010 16:18:45 +0000 (16:18 +0000)
Lib/subprocess.py
Lib/test/test_subprocess.py

index 395b7a3400d4f2eb1a821e780703dc9fd348204f..247824b0134c38156ed893ccd73cfbab08cf0596 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() >= 0x80000000L or
                         os.path.basename(comspec).lower() == "command.com"):
                     # Win9x, or using command.com on NT. We need to
index 15ca19753f0d0393b8d56f7b88def05a91671ac7..ccb7a690ff7e4b8a00570910573010db3c4e005e 100644 (file)
@@ -872,12 +872,54 @@ class HelperFunctionTests(unittest.TestCase):
         self.assertEqual([(256, 999), (666,), (666,)], record_calls)
 
 
+@unittest.skipUnless(mswindows, "mswindows only")
+class CommandsWithSpaces (BaseTestCase):
+
+    def setUp(self):
+        super(CommandsWithSpaces, self).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(CommandsWithSpaces, self).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"])
+
 def test_main():
     unit_tests = (ProcessTestCase,
                   POSIXProcessTestCase,
                   Win32ProcessTestCase,
                   ProcessTestCaseNoPoll,
-                  HelperFunctionTests)
+                  HelperFunctionTests,
+                  CommandsWithSpaces)
 
     test_support.run_unittest(*unit_tests)
     test_support.reap_children()