subprocess now emits a ResourceWarning warning

Issue #26741: subprocess.Popen destructor now emits a ResourceWarning warning
if the child process is still running.
This commit is contained in:
Victor Stinner 2016-05-20 12:11:15 +02:00
parent a58e2c5c49
commit 5a48e21ff1
5 changed files with 26 additions and 2 deletions

View File

@ -497,6 +497,10 @@ functions.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
Added context manager support. Added context manager support.
.. versionchanged:: 3.6
Popen destructor now emits a :exc:`ResourceWarning` warning if the child
process is still running.
Exceptions Exceptions
^^^^^^^^^^ ^^^^^^^^^^

View File

@ -330,6 +330,16 @@ protocol.
(Contributed by Aviv Palivoda in :issue:`26404`.) (Contributed by Aviv Palivoda in :issue:`26404`.)
subprocess
----------
:class:`subprocess.Popen` destructor now emits a :exc:`ResourceWarning` warning
if the child process is still running. Use the context manager protocol (``with
proc: ...``) or call explicitly the :meth:`~subprocess.Popen.wait` method to
read the exit status of the child process (Contributed by Victor Stinner in
:issue:`26741`).
telnetlib telnetlib
--------- ---------

View File

@ -1006,6 +1006,9 @@ class Popen(object):
if not self._child_created: if not self._child_created:
# We didn't get to successfully create a child process. # We didn't get to successfully create a child process.
return return
if self.returncode is None:
warnings.warn("running subprocess %r" % self, ResourceWarning,
source=self)
# In case the child hasn't been waited on, check if it's done. # In case the child hasn't been waited on, check if it's done.
self._internal_poll(_deadstate=_maxsize) self._internal_poll(_deadstate=_maxsize)
if self.returncode is None and _active is not None: if self.returncode is None and _active is not None:

View File

@ -2286,7 +2286,9 @@ class POSIXProcessTestCase(BaseTestCase):
self.addCleanup(p.stderr.close) self.addCleanup(p.stderr.close)
ident = id(p) ident = id(p)
pid = p.pid pid = p.pid
del p with support.check_warnings(('', ResourceWarning)):
p = None
# check that p is in the active processes list # check that p is in the active processes list
self.assertIn(ident, [id(o) for o in subprocess._active]) self.assertIn(ident, [id(o) for o in subprocess._active])
@ -2305,7 +2307,9 @@ class POSIXProcessTestCase(BaseTestCase):
self.addCleanup(p.stderr.close) self.addCleanup(p.stderr.close)
ident = id(p) ident = id(p)
pid = p.pid pid = p.pid
del p with support.check_warnings(('', ResourceWarning)):
p = None
os.kill(pid, signal.SIGKILL) os.kill(pid, signal.SIGKILL)
# check that p is in the active processes list # check that p is in the active processes list
self.assertIn(ident, [id(o) for o in subprocess._active]) self.assertIn(ident, [id(o) for o in subprocess._active])

View File

@ -16,6 +16,9 @@ Core and Builtins
Library Library
------- -------
- Issue #26741: subprocess.Popen destructor now emits a ResourceWarning warning
if the child process is still running.
- Issue #27056: Optimize pickle.load() and pickle.loads(), up to 10% faster - Issue #27056: Optimize pickle.load() and pickle.loads(), up to 10% faster
to deserialize a lot of small objects. to deserialize a lot of small objects.