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

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


Author: tim.golden
Date: Sun Aug  8 18:17:48 2010
New Revision: 83830

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

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

Modified: python/branches/py3k/Lib/subprocess.py
==============================================================================
--- python/branches/py3k/Lib/subprocess.py	(original)
+++ python/branches/py3k/Lib/subprocess.py	Sun Aug  8 18:17:48 2010
@@ -853,7 +853,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/py3k/Lib/test/test_subprocess.py
==============================================================================
--- python/branches/py3k/Lib/test/test_subprocess.py	(original)
+++ python/branches/py3k/Lib/test/test_subprocess.py	Sun Aug  8 18:17:48 2010
@@ -1015,6 +1015,7 @@
         self._kill_process('terminate')
 
 
+
 # The module says:
 #   "NB This only works (and is only relevant) for UNIX."
 #
@@ -1041,6 +1042,46 @@
             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 @@
                   Win32ProcessTestCase,
                   ProcessTestCasePOSIXPurePython,
                   CommandTests,
+                  CommandsWithSpaces,
                   ProcessTestCaseNoPoll,
                   HelperFunctionTests)
 


More information about the Python-checkins mailing list