Issue #21619: Popen objects no longer leave a zombie after exit in the with
statement if the pipe was broken. Patch by Martin Panter.
This commit is contained in:
commit
86ba765705
|
@ -892,10 +892,12 @@ class Popen(object):
|
|||
self.stdout.close()
|
||||
if self.stderr:
|
||||
self.stderr.close()
|
||||
if self.stdin:
|
||||
self.stdin.close()
|
||||
# Wait for the process to terminate, to avoid zombies.
|
||||
self.wait()
|
||||
try: # Flushing a BufferedWriter may raise an error
|
||||
if self.stdin:
|
||||
self.stdin.close()
|
||||
finally:
|
||||
# Wait for the process to terminate, to avoid zombies.
|
||||
self.wait()
|
||||
|
||||
def __del__(self, _maxsize=sys.maxsize):
|
||||
if not self._child_created:
|
||||
|
|
|
@ -2502,6 +2502,21 @@ class ContextManagerTests(BaseTestCase):
|
|||
stderr=subprocess.PIPE) as proc:
|
||||
pass
|
||||
|
||||
def test_broken_pipe_cleanup(self):
|
||||
"""Broken pipe error should not prevent wait() (Issue 21619)"""
|
||||
proc = subprocess.Popen([sys.executable, "-c",
|
||||
"import sys;"
|
||||
"sys.stdin.close();"
|
||||
"sys.stdout.close();" # Signals that input pipe is closed
|
||||
], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
proc.stdout.read() # Make sure subprocess has closed its input
|
||||
proc.stdin.write(b"buffered data")
|
||||
self.assertIsNone(proc.returncode)
|
||||
self.assertRaises(BrokenPipeError, proc.__exit__, None, None, None)
|
||||
self.assertEqual(0, proc.returncode)
|
||||
self.assertTrue(proc.stdin.closed)
|
||||
self.assertTrue(proc.stdout.closed)
|
||||
|
||||
|
||||
def test_main():
|
||||
unit_tests = (ProcessTestCase,
|
||||
|
|
|
@ -13,6 +13,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #21619: Popen objects no longer leave a zombie after exit in the with
|
||||
statement if the pipe was broken. Patch by Martin Panter.
|
||||
|
||||
- Issue #15955: Add an option to limit the output size in bz2.decompress().
|
||||
Patch by Nikolaus Rath.
|
||||
|
||||
|
|
Loading…
Reference in New Issue