You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					79 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					79 lines
				
				2.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								from abc import abstractmethod
							 | 
						||
| 
								 | 
							
								from signal import Signals
							 | 
						||
| 
								 | 
							
								from typing import Optional
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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) -> Optional[int]:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        The return code of the process. If the process has not yet terminated, this will be
							 | 
						||
| 
								 | 
							
								        ``None``.
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @property
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    def stdin(self) -> Optional[ByteSendStream]:
							 | 
						||
| 
								 | 
							
								        """The stream for the standard input of the process."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @property
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    def stdout(self) -> Optional[ByteReceiveStream]:
							 | 
						||
| 
								 | 
							
								        """The stream for the standard output of the process."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @property
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    def stderr(self) -> Optional[ByteReceiveStream]:
							 | 
						||
| 
								 | 
							
								        """The stream for the standard error output of the process."""
							 |