diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index f0ffbf0b8ec..b6532618266 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 `. .. 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 23d6b4da92b..e4c14995a74 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()