diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index ead4039b2f7..b2f5304f772 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -166,7 +166,7 @@ class Process: @coroutine def communicate(self, input=None): - if input: + if input is not None: stdin = self._feed_stdin(input) else: stdin = self._noop() diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index e90f17dda63..4803826024f 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -287,6 +287,25 @@ class SubprocessMixin: self.assertEqual(output.rstrip(), b'3') self.assertEqual(exitcode, 0) + def test_empty_input(self): + @asyncio.coroutine + def empty_input(): + code = 'import sys; data = sys.stdin.read(); print(len(data))' + proc = yield from asyncio.create_subprocess_exec( + sys.executable, '-c', code, + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + close_fds=False, + loop=self.loop) + stdout, stderr = yield from proc.communicate(b'') + exitcode = yield from proc.wait() + return (stdout, exitcode) + + output, exitcode = self.loop.run_until_complete(empty_input()) + self.assertEqual(output.rstrip(), b'0') + self.assertEqual(exitcode, 0) + def test_cancel_process_wait(self): # Issue #23140: cancel Process.wait() diff --git a/Misc/NEWS b/Misc/NEWS index 27aa6f0b68d..bede515d9ba 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -952,6 +952,9 @@ Library - Issue #26406: Avoid unnecessary serialization of getaddrinfo(3) calls on current versions of OpenBSD and NetBSD. Patch by A. Jesse Jiryu Davis. +- Issue #26848: Fix asyncio/subprocess.communicate() to handle empty input. + Patch by Jack O'Connor. + IDLE ----