mirror of
https://github.com/python/cpython.git
synced 2025-09-01 06:28:36 +00:00
asyncio: Remove Process.subprocess attribute; it's too easy to get inconsistent
Process and Popen objects
This commit is contained in:
parent
313f829ce8
commit
0c3949c963
3 changed files with 1 additions and 29 deletions
|
@ -87,10 +87,6 @@ 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:: subprocess
|
|
||||||
|
|
||||||
Underlying :class:`subprocess.Popen` object.
|
|
||||||
|
|
||||||
.. method:: communicate(input=None)
|
.. method:: communicate(input=None)
|
||||||
|
|
||||||
Interact with process: Send data to stdin. Read data from stdout and
|
Interact with process: Send data to stdin. Read data from stdout and
|
||||||
|
@ -102,7 +98,7 @@ Process
|
||||||
:meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``.
|
:meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``.
|
||||||
|
|
||||||
Note that if you want to send data to the process's stdin, you need to
|
Note that if you want to send data to the process's stdin, you need to
|
||||||
create the Popen object with ``stdin=PIPE``. Similarly, to get anything
|
create the Process object with ``stdin=PIPE``. Similarly, to get anything
|
||||||
other than ``None`` in the result tuple, you need to give ``stdout=PIPE``
|
other than ``None`` in the result tuple, you need to give ``stdout=PIPE``
|
||||||
and/or ``stderr=PIPE`` too.
|
and/or ``stderr=PIPE`` too.
|
||||||
|
|
||||||
|
|
|
@ -106,10 +106,6 @@ class Process:
|
||||||
yield from waiter
|
yield from waiter
|
||||||
return waiter.result()
|
return waiter.result()
|
||||||
|
|
||||||
@property
|
|
||||||
def subprocess(self):
|
|
||||||
return self._transport.get_extra_info('subprocess')
|
|
||||||
|
|
||||||
def _check_alive(self):
|
def _check_alive(self):
|
||||||
if self._transport.get_returncode() is not None:
|
if self._transport.get_returncode() is not None:
|
||||||
raise ProcessLookupError()
|
raise ProcessLookupError()
|
||||||
|
|
|
@ -7,9 +7,6 @@ from test import support
|
||||||
if sys.platform != 'win32':
|
if sys.platform != 'win32':
|
||||||
from asyncio import unix_events
|
from asyncio import unix_events
|
||||||
|
|
||||||
# Program exiting quickly
|
|
||||||
PROGRAM_EXIT_FAST = [sys.executable, '-c', 'pass']
|
|
||||||
|
|
||||||
# Program blocking
|
# Program blocking
|
||||||
PROGRAM_BLOCKED = [sys.executable, '-c', 'import time; time.sleep(3600)']
|
PROGRAM_BLOCKED = [sys.executable, '-c', 'import time; time.sleep(3600)']
|
||||||
|
|
||||||
|
@ -119,23 +116,6 @@ 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_subprocess(self):
|
|
||||||
args = PROGRAM_EXIT_FAST
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
|
||||||
def run():
|
|
||||||
proc = yield from asyncio.create_subprocess_exec(*args,
|
|
||||||
loop=self.loop)
|
|
||||||
yield from proc.wait()
|
|
||||||
# need to poll subprocess.Popen, otherwise the returncode
|
|
||||||
# attribute is not set
|
|
||||||
proc.subprocess.wait()
|
|
||||||
return proc
|
|
||||||
|
|
||||||
proc = self.loop.run_until_complete(run())
|
|
||||||
self.assertEqual(proc.subprocess.returncode, proc.returncode)
|
|
||||||
self.assertEqual(proc.subprocess.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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue