diff -r 61a045ac0006 Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py Thu Jan 15 00:05:18 2015 +0100 +++ b/Lib/asyncio/subprocess.py Thu Jan 15 00:06:59 2015 +0100 @@ -107,6 +107,7 @@ class Process: self._transport = transport self._protocol = protocol self._loop = loop + self._returncode = None self.stdin = protocol.stdin self.stdout = protocol.stdout self.stderr = protocol.stderr @@ -115,14 +116,25 @@ class Process: def __repr__(self): return '<%s %s>' % (self.__class__.__name__, self.pid) + def _get_returncode(self): + if self._returncode is not None: + return self._returncode + else: + returncode = self._transport.get_returncode() + if returncode is not None: + self._returncode = returncode + self._transport.close() + self._transport = None + return returncode + @property def returncode(self): - return self._transport.get_returncode() + return self._get_returncode() @coroutine def wait(self): """Wait until the process exit and return the process return code.""" - returncode = self._transport.get_returncode() + returncode = self._get_returncode() if returncode is not None: return returncode @@ -132,7 +144,7 @@ class Process: return waiter.result() def _check_alive(self): - if self._transport.get_returncode() is not None: + if self._get_returncode() is not None: raise ProcessLookupError() def send_signal(self, signal): @@ -189,6 +201,7 @@ class Process: @coroutine def communicate(self, input=None): + self._check_alive() if input: stdin = self._feed_stdin(input) else: