changeset: 101446:b7f3494deb2c user: Victor Stinner date: Fri May 20 12:11:15 2016 +0200 files: Doc/library/subprocess.rst Doc/whatsnew/3.6.rst Lib/subprocess.py Lib/test/test_subprocess.py Misc/NEWS description: subprocess now emits a ResourceWarning warning Issue #26741: subprocess.Popen destructor now emits a ResourceWarning warning if the child process is still running. diff -r 4c02b983bd5f -r b7f3494deb2c Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst Fri May 20 12:08:12 2016 +0200 +++ b/Doc/library/subprocess.rst Fri May 20 12:11:15 2016 +0200 @@ -497,6 +497,10 @@ .. versionchanged:: 3.2 Added context manager support. + .. versionchanged:: 3.6 + Popen destructor now emits a :exc:`ResourceWarning` warning if the child + process is still running. + Exceptions ^^^^^^^^^^ diff -r 4c02b983bd5f -r b7f3494deb2c Doc/whatsnew/3.6.rst --- a/Doc/whatsnew/3.6.rst Fri May 20 12:08:12 2016 +0200 +++ b/Doc/whatsnew/3.6.rst Fri May 20 12:11:15 2016 +0200 @@ -330,6 +330,16 @@ (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 --------- diff -r 4c02b983bd5f -r b7f3494deb2c Lib/subprocess.py --- a/Lib/subprocess.py Fri May 20 12:08:12 2016 +0200 +++ b/Lib/subprocess.py Fri May 20 12:11:15 2016 +0200 @@ -1006,6 +1006,9 @@ if not self._child_created: # We didn't get to successfully create a child process. 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. self._internal_poll(_deadstate=_maxsize) if self.returncode is None and _active is not None: diff -r 4c02b983bd5f -r b7f3494deb2c Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py Fri May 20 12:08:12 2016 +0200 +++ b/Lib/test/test_subprocess.py Fri May 20 12:11:15 2016 +0200 @@ -2286,7 +2286,9 @@ self.addCleanup(p.stderr.close) ident = id(p) pid = p.pid - del p + with support.check_warnings(('', ResourceWarning)): + p = None + # check that p is in the active processes list self.assertIn(ident, [id(o) for o in subprocess._active]) @@ -2305,7 +2307,9 @@ self.addCleanup(p.stderr.close) ident = id(p) pid = p.pid - del p + with support.check_warnings(('', ResourceWarning)): + p = None + os.kill(pid, signal.SIGKILL) # check that p is in the active processes list self.assertIn(ident, [id(o) for o in subprocess._active]) diff -r 4c02b983bd5f -r b7f3494deb2c Misc/NEWS --- a/Misc/NEWS Fri May 20 12:08:12 2016 +0200 +++ b/Misc/NEWS Fri May 20 12:11:15 2016 +0200 @@ -16,6 +16,9 @@ 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 to deserialize a lot of small objects.