[Python-checkins] cpython (3.2): Issue #12493: subprocess: communicate() handles EINTR

victor.stinner python-checkins at python.org
Tue Jul 5 14:08:17 CEST 2011


http://hg.python.org/cpython/rev/dcfacc2d93b4
changeset: 71228:dcfacc2d93b4
branch: 3.2
parent: 71224:7acdf9f5eb31
user: Victor Stinner <victor.stinner at haypocalc.com>
date: Tue Jul 05 14:00:56 2011 +0200
summary:
 Issue #12493: subprocess: communicate() handles EINTR
subprocess.Popen.communicate() now also handles EINTR errors if the process has
only one pipe.
files:
 Lib/subprocess.py | 6 +++---
 Lib/test/test_subprocess.py | 16 ++++++++++++++++
 Misc/NEWS | 3 +++
 3 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -450,7 +450,7 @@
 while True:
 try:
 return func(*args)
- except OSError as e:
+ except (OSError, IOError) as e:
 if e.errno == errno.EINTR:
 continue
 raise
@@ -804,10 +804,10 @@
 raise
 self.stdin.close()
 elif self.stdout:
- stdout = self.stdout.read()
+ stdout = _eintr_retry_call(self.stdout.read)
 self.stdout.close()
 elif self.stderr:
- stderr = self.stderr.read()
+ stderr = _eintr_retry_call(self.stderr.read)
 self.stderr.close()
 self.wait()
 return (stdout, stderr)
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -675,6 +675,22 @@
 time.sleep(2)
 p.communicate(b"x" * 2**20)
 
+ def test_communicate_eintr(self):
+ # Issue #12493: communicate() should handle EINTR
+ def handler(signum, frame):
+ pass
+ old_handler = signal.signal(signal.SIGALRM, handler)
+ self.addCleanup(signal.signal, signal.SIGALRM, old_handler)
+
+ # the process is running for 2 seconds
+ args = [sys.executable, "-c", 'import time; time.sleep(2)']
+ for stream in ('stdout', 'stderr'):
+ kw = {stream: subprocess.PIPE}
+ with subprocess.Popen(args, **kw) as process:
+ signal.alarm(1)
+ # communicate() will be interrupted by SIGALRM
+ process.communicate()
+
 
 # context manager
 class _SuppressCoreFiles(object):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,9 @@
 Library
 -------
 
+- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors
+ if the process has only one pipe.
+
 - Issue #12467: warnings: fix a race condition if a warning is emitted at
 shutdown, if globals()['__file__'] is None.
 
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /