#2304: fix incorporating Eric Smith's .format suggestion and tested on Ubuntu as well as Windows
This commit is contained in:
parent
d748c3d4a2
commit
595c8d34a3
|
@ -829,7 +829,7 @@ class Popen(object):
|
||||||
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
|
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
|
||||||
startupinfo.wShowWindow = _subprocess.SW_HIDE
|
startupinfo.wShowWindow = _subprocess.SW_HIDE
|
||||||
comspec = os.environ.get("COMSPEC", "cmd.exe")
|
comspec = os.environ.get("COMSPEC", "cmd.exe")
|
||||||
args = comspec + " /c " + args
|
args = '{} /c "{}"'.format (comspec, args)
|
||||||
if (_subprocess.GetVersion() >= 0x80000000 or
|
if (_subprocess.GetVersion() >= 0x80000000 or
|
||||||
os.path.basename(comspec).lower() == "command.com"):
|
os.path.basename(comspec).lower() == "command.com"):
|
||||||
# Win9x, or using command.com on NT. We need to
|
# Win9x, or using command.com on NT. We need to
|
||||||
|
|
|
@ -28,7 +28,7 @@ def remove_stderr_debug_decorations(stderr):
|
||||||
return re.sub("\[\d+ refs\]\r?\n?$", "", stderr.decode()).encode()
|
return re.sub("\[\d+ refs\]\r?\n?$", "", stderr.decode()).encode()
|
||||||
#return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
|
#return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
|
||||||
|
|
||||||
class ProcessTestCase(unittest.TestCase):
|
class BaseTestCase(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# Try to minimize the number of children we have so this test
|
# Try to minimize the number of children we have so this test
|
||||||
# doesn't crash on some buildbots (Alphas in particular).
|
# doesn't crash on some buildbots (Alphas in particular).
|
||||||
|
@ -41,14 +41,15 @@ class ProcessTestCase(unittest.TestCase):
|
||||||
if hasattr(support, "reap_children"):
|
if hasattr(support, "reap_children"):
|
||||||
support.reap_children()
|
support.reap_children()
|
||||||
|
|
||||||
def mkstemp(self):
|
def mkstemp(self, *args, **kwargs):
|
||||||
"""wrapper for mkstemp, calling mktemp if mkstemp is not available"""
|
"""wrapper for mkstemp, calling mktemp if mkstemp is not available"""
|
||||||
if hasattr(tempfile, "mkstemp"):
|
if hasattr(tempfile, "mkstemp"):
|
||||||
return tempfile.mkstemp()
|
return tempfile.mkstemp(*args, **kwargs)
|
||||||
else:
|
else:
|
||||||
fname = tempfile.mktemp()
|
fname = tempfile.mktemp(*args, **kwargs)
|
||||||
return os.open(fname, os.O_RDWR|os.O_CREAT), fname
|
return os.open(fname, os.O_RDWR|os.O_CREAT), fname
|
||||||
|
|
||||||
|
class ProcessTestCase(BaseTestCase):
|
||||||
#
|
#
|
||||||
# Generic tests
|
# Generic tests
|
||||||
#
|
#
|
||||||
|
@ -863,6 +864,7 @@ class ProcessTestCase(unittest.TestCase):
|
||||||
p.terminate()
|
p.terminate()
|
||||||
self.assertNotEqual(p.wait(), 0)
|
self.assertNotEqual(p.wait(), 0)
|
||||||
|
|
||||||
|
|
||||||
class CommandTests(unittest.TestCase):
|
class CommandTests(unittest.TestCase):
|
||||||
# The module says:
|
# The module says:
|
||||||
# "NB This only works (and is only relevant) for UNIX."
|
# "NB This only works (and is only relevant) for UNIX."
|
||||||
|
@ -893,6 +895,50 @@ class CommandTests(unittest.TestCase):
|
||||||
|
|
||||||
unit_tests = [ProcessTestCase, CommandTests]
|
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):
|
if getattr(subprocess, '_has_poll', False):
|
||||||
class ProcessTestCaseNoPoll(ProcessTestCase):
|
class ProcessTestCaseNoPoll(ProcessTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
Loading…
Reference in New Issue