asyncio.subprocess: Replace Process.get_subprocess() method with a

Process.subprocess read-only property
This commit is contained in:
Victor Stinner 2014-02-03 23:08:14 +01:00
parent cb306d1b59
commit b79eb0502c
3 changed files with 27 additions and 26 deletions

View file

@ -57,6 +57,21 @@ Process
.. class:: asyncio.subprocess.Process .. class:: asyncio.subprocess.Process
.. attribute:: pid
The identifier of the process.
Note that if you set the *shell* argument to ``True``, this is the
process identifier of the spawned shell.
.. attribute:: returncode
Return code of the process when it exited. A ``None`` value indicates
that the process has not terminated yet.
A negative value ``-N`` indicates that the child was terminated by signal
``N`` (Unix only).
.. attribute:: stdin .. attribute:: stdin
Standard input stream (write), ``None`` if the process was created with Standard input stream (write), ``None`` if the process was created with
@ -72,20 +87,9 @@ Process
Standard error stream (read), ``None`` if the process was created with Standard error stream (read), ``None`` if the process was created with
``stderr=None``. ``stderr=None``.
.. attribute:: pid .. attribute:: subprocess
The identifier of the process. Underlying :class:`subprocess.Popen` object.
Note that if you set the *shell* argument to ``True``, this is the
process identifier of the spawned shell.
.. attribute:: returncode
Return code of the process when it exited. A ``None`` value indicates
that the process has not terminated yet.
A negative value ``-N`` indicates that the child was terminated by signal
``N`` (Unix only).
.. method:: communicate(input=None) .. method:: communicate(input=None)
@ -107,10 +111,6 @@ Process
The data read is buffered in memory, so do not use this method if the The data read is buffered in memory, so do not use this method if the
data size is large or unlimited. data size is large or unlimited.
.. method:: get_subprocess()
Get the underlying :class:`subprocess.Popen` object.
.. method:: kill() .. method:: kill()
Kills the child. On Posix OSs the function sends :py:data:`SIGKILL` to Kills the child. On Posix OSs the function sends :py:data:`SIGKILL` to

View file

@ -106,7 +106,8 @@ class Process:
yield from waiter yield from waiter
return waiter.result() return waiter.result()
def get_subprocess(self): @property
def subprocess(self):
return self._transport.get_extra_info('subprocess') return self._transport.get_extra_info('subprocess')
def _check_alive(self): def _check_alive(self):

View file

@ -119,7 +119,7 @@ class SubprocessMixin:
returncode = self.loop.run_until_complete(proc.wait()) returncode = self.loop.run_until_complete(proc.wait())
self.assertEqual(-signal.SIGHUP, returncode) self.assertEqual(-signal.SIGHUP, returncode)
def test_get_subprocess(self): def test_subprocess(self):
args = PROGRAM_EXIT_FAST args = PROGRAM_EXIT_FAST
@asyncio.coroutine @asyncio.coroutine
@ -127,14 +127,14 @@ class SubprocessMixin:
proc = yield from asyncio.create_subprocess_exec(*args, proc = yield from asyncio.create_subprocess_exec(*args,
loop=self.loop) loop=self.loop)
yield from proc.wait() yield from proc.wait()
# need to poll subprocess.Popen, otherwise the returncode
# attribute is not set
proc.subprocess.wait()
return proc
popen = proc.get_subprocess() proc = self.loop.run_until_complete(run())
popen.wait() self.assertEqual(proc.subprocess.returncode, proc.returncode)
return (proc, popen) self.assertEqual(proc.subprocess.pid, proc.pid)
proc, popen = self.loop.run_until_complete(run())
self.assertEqual(popen.returncode, proc.returncode)
self.assertEqual(popen.pid, proc.pid)
def test_broken_pipe(self): def test_broken_pipe(self):
large_data = b'x' * support.PIPE_MAX_SIZE large_data = b'x' * support.PIPE_MAX_SIZE