diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-07-17 11:12:03 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-07-17 11:12:03 (GMT) |
commit | d55b54d5c0e6f469145f394d18e39156baa2ca79 (patch) | |
tree | 8400fd9032c6f2e5506495ce6e1ae713484f181b | |
parent | cc996b57890a251cef83101d5cfcbc58179cba5f (diff) | |
download | cpython-d55b54d5c0e6f469145f394d18e39156baa2ca79.zip cpython-d55b54d5c0e6f469145f394d18e39156baa2ca79.tar.gz cpython-d55b54d5c0e6f469145f394d18e39156baa2ca79.tar.bz2 |
asyncio, tulip issue 190: Process.communicate() now ignores
ConnectionResetError too
-rw-r--r-- | Doc/library/asyncio-subprocess.rst | 9 | ||||
-rw-r--r-- | Lib/asyncio/subprocess.py | 12 |
2 files changed, 12 insertions, 9 deletions
diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index f0ffbf0..b653261 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -191,9 +191,9 @@ Process process, or ``None``, if no data should be sent to the child. The type of *input* must be bytes. - If a :exc:`BrokenPipeError` is raised when writing *input* into stdin, - the exception is ignored. It occurs when the process exits before all - data are written into stdin. + If a :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is + raised when writing *input* into stdin, the exception is ignored. It + occurs when the process exits before all data are written into stdin. :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``. @@ -210,7 +210,8 @@ Process This method is a :ref:`coroutine <coroutine>`. .. versionchanged:: 3.4.2 - The method now ignores :exc:`BrokenPipeError`. + The method now ignores :exc:`BrokenPipeError` and + :exc:`ConnectionResetError`. .. method:: kill() diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index 23d6b4d..e4c1499 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -139,17 +139,19 @@ class Process: @coroutine def _feed_stdin(self, input): + debug = self._loop.get_debug() self.stdin.write(input) - if self._loop.get_debug(): + if debug: logger.debug('%r communicate: feed stdin (%s bytes)', self, len(input)) try: yield from self.stdin.drain() - except BrokenPipeError: - # ignore BrokenPipeError - pass + except (BrokenPipeError, ConnectionResetError) as exc: + # communicate() ignores BrokenPipeError and ConnectionResetError + if debug: + logger.debug('%r communicate: stdin got %r', self, exc) - if self._loop.get_debug(): + if debug: logger.debug('%r communicate: close stdin', self) self.stdin.close() |