Close #12085: Fix an attribute error in subprocess.Popen destructor if the

constructor has failed, e.g. because of an undeclared keyword argument. Patch
written by Oleg Oshmyan.
This commit is contained in:
Victor Stinner 2011-06-01 01:03:00 +02:00
parent d9f5292443
commit 776e69b5b3
4 changed files with 19 additions and 1 deletions

View File

@ -707,7 +707,10 @@ class Popen(object):
def __del__(self, _maxint=sys.maxint, _active=_active):
if not self._child_created:
# If __init__ hasn't had a chance to execute (e.g. if it
# was passed an undeclared keyword argument), we don't
# have a _child_created attribute at all.
if not getattr(self, '_child_created', False):
# We didn't get to successfully create a child process.
return
# In case the child hasn't been waited on, check if it's done.

View File

@ -113,6 +113,16 @@ class ProcessTestCase(BaseTestCase):
env=newenv)
self.assertEqual(rc, 1)
def test_invalid_args(self):
# Popen() called with invalid arguments should raise TypeError
# but Popen.__del__ should not complain (issue #12085)
with support.captured_stderr() as s:
self.assertRaises(TypeError, subprocess.Popen, invalid_arg_name=1)
argcount = subprocess.Popen.__init__.__code__.co_argcount
too_many_args = [0] * (argcount + 1)
self.assertRaises(TypeError, subprocess.Popen, *too_many_args)
self.assertEqual(s.getvalue(), '')
def test_stdin_none(self):
# .stdin is None when not redirected
p = subprocess.Popen([sys.executable, "-c", 'print "banana"'],

View File

@ -607,6 +607,7 @@ Piet van Oostrum
Jason Orendorff
Douglas Orr
Michele Orrù
Oleg Oshmyan
Denis S. Otkidach
Michael Otteneder
R. M. Oudkerk

View File

@ -16,6 +16,10 @@ Core and Builtins
Library
-------
- Issue #12085: Fix an attribute error in subprocess.Popen destructor if the
constructor has failed, e.g. because of an undeclared keyword argument. Patch
written by Oleg Oshmyan.
Tests
-----