From: Tim Golden Date: Thu, 12 Aug 2010 11:00:35 +0000 (+0000) Subject: #2304: fix incorporating Eric Smith's .format suggestion and tested on Ubuntu as... X-Git-Tag: v2.7.1rc1~416 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e4756c7635cda029e75d3c9ad6daefce3a707e6;p=python #2304: fix incorporating Eric Smith's .format suggestion and tested on Ubuntu as well as Windows --- diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 395b7a3400..68de777644 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -853,8 +853,8 @@ class Popen(object): startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = _subprocess.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") - args = comspec + " /c " + args - if (_subprocess.GetVersion() >= 0x80000000L or + args = '{} /c "{}"'.format (comspec, args) + if (_subprocess.GetVersion() >= 0x80000000 or os.path.basename(comspec).lower() == "command.com"): # Win9x, or using command.com on NT. We need to # use the w9xpopen intermediate program. For more diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 15ca19753f..ccb7a690ff 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -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()