|
from __future__ import annotations |
|
|
|
from abc import abstractmethod |
|
from signal import Signals |
|
|
|
from ._resources import AsyncResource |
|
from ._streams import ByteReceiveStream, ByteSendStream |
|
|
|
|
|
class Process(AsyncResource): |
|
"""An asynchronous version of :class:`subprocess.Popen`.""" |
|
|
|
@abstractmethod |
|
async def wait(self) -> int: |
|
""" |
|
Wait until the process exits. |
|
|
|
:return: the exit code of the process |
|
""" |
|
|
|
@abstractmethod |
|
def terminate(self) -> None: |
|
""" |
|
Terminates the process, gracefully if possible. |
|
|
|
On Windows, this calls ``TerminateProcess()``. |
|
On POSIX systems, this sends ``SIGTERM`` to the process. |
|
|
|
.. seealso:: :meth:`subprocess.Popen.terminate` |
|
""" |
|
|
|
@abstractmethod |
|
def kill(self) -> None: |
|
""" |
|
Kills the process. |
|
|
|
On Windows, this calls ``TerminateProcess()``. |
|
On POSIX systems, this sends ``SIGKILL`` to the process. |
|
|
|
.. seealso:: :meth:`subprocess.Popen.kill` |
|
""" |
|
|
|
@abstractmethod |
|
def send_signal(self, signal: Signals) -> None: |
|
""" |
|
Send a signal to the subprocess. |
|
|
|
.. seealso:: :meth:`subprocess.Popen.send_signal` |
|
|
|
:param signal: the signal number (e.g. :data:`signal.SIGHUP`) |
|
""" |
|
|
|
@property |
|
@abstractmethod |
|
def pid(self) -> int: |
|
"""The process ID of the process.""" |
|
|
|
@property |
|
@abstractmethod |
|
def returncode(self) -> int | None: |
|
""" |
|
The return code of the process. If the process has not yet terminated, this will |
|
be ``None``. |
|
""" |
|
|
|
@property |
|
@abstractmethod |
|
def stdin(self) -> ByteSendStream | None: |
|
"""The stream for the standard input of the process.""" |
|
|
|
@property |
|
@abstractmethod |
|
def stdout(self) -> ByteReceiveStream | None: |
|
"""The stream for the standard output of the process.""" |
|
|
|
@property |
|
@abstractmethod |
|
def stderr(self) -> ByteReceiveStream | None: |
|
"""The stream for the standard error output of the process.""" |
|
|