Issue #26848: Fix asyncio/subprocess.communicate() to handle empty input.

This commit is contained in:
Yury Selivanov 2016-05-13 15:35:28 -04:00
parent d76c7c2bed
commit 7657f6ba21
3 changed files with 23 additions and 1 deletions

View file

@ -166,7 +166,7 @@ class Process:
@coroutine @coroutine
def communicate(self, input=None): def communicate(self, input=None):
if input: if input is not None:
stdin = self._feed_stdin(input) stdin = self._feed_stdin(input)
else: else:
stdin = self._noop() stdin = self._noop()

View file

@ -287,6 +287,25 @@ class SubprocessMixin:
self.assertEqual(output.rstrip(), b'3') self.assertEqual(output.rstrip(), b'3')
self.assertEqual(exitcode, 0) 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): def test_cancel_process_wait(self):
# Issue #23140: cancel Process.wait() # Issue #23140: cancel Process.wait()

View file

@ -436,6 +436,9 @@ Library
- Issue #26406: Avoid unnecessary serialization of getaddrinfo(3) calls on - Issue #26406: Avoid unnecessary serialization of getaddrinfo(3) calls on
current versions of OpenBSD and NetBSD. Patch by A. Jesse Jiryu Davis. 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.
Documentation Documentation
------------- -------------