U
    pd                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ej
Z
ejZejZG d	d
 d
ejejZG dd dZddddejfddZddddejdddZdS ))create_subprocess_execcreate_subprocess_shell    N   )events)	protocols)streams)tasks)loggerc                       sX   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Z  ZS )SubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.c                    sH   t  j|d || _d  | _ | _| _d | _d| _g | _| j	
 | _d S )NloopF)super__init___limitstdinstdoutstderr
_transport_process_exited	_pipe_fds_loopZcreate_future_stdin_closed)selflimitr   	__class__ (/usr/lib/python3.8/asyncio/subprocess.pyr      s    z!SubprocessStreamProtocol.__init__c                 C   sn   | j jg}| jd k	r&|d| j | jd k	rB|d| j | jd k	r^|d| j dd|S )Nzstdin=zstdout=zstderr=z<{}> )r   __name__r   appendr   r   formatjoin)r   infor   r   r   __repr__   s    



z!SubprocessStreamProtocol.__repr__c                 C   s   || _ |d}|d k	rDtj| j| jd| _| j| | j	d |d}|d k	rtj| j| jd| _
| j
| | j	d |d}|d k	rtj|| d | jd| _d S )Nr   r   r      r   )protocolreaderr   )r   get_pipe_transportr   StreamReaderr   r   r   Zset_transportr   r    r   StreamWriterr   )r   	transportZstdout_transportZstderr_transportZstdin_transportr   r   r   connection_made)   s,    


z(SubprocessStreamProtocol.connection_madec                 C   s:   |dkr| j }n|dkr | j}nd }|d k	r6|| d S )Nr   r&   )r   r   Z	feed_data)r   fddatar(   r   r   r   pipe_data_receivedA   s    z+SubprocessStreamProtocol.pipe_data_receivedc                 C   s   |dkrN| j }|d k	r|  | | |d kr>| jd  n| j| d S |dkr^| j}n|dkrn| j}nd }|d k	r|d kr|  n
|| || j	kr| j	
| |   d S )Nr   r   r&   )r   closeZconnection_lostr   Z
set_resultZset_exceptionr   r   Zfeed_eofr   remove_maybe_close_transport)r   r.   excpiper(   r   r   r   pipe_connection_lostK   s*    



z-SubprocessStreamProtocol.pipe_connection_lostc                 C   s   d| _ |   d S )NT)r   r3   r   r   r   r   process_exitedf   s    z'SubprocessStreamProtocol.process_exitedc                 C   s(   t | jdkr$| jr$| j  d | _d S )Nr   )lenr   r   r   r1   r7   r   r   r   r3   j   s    
z/SubprocessStreamProtocol._maybe_close_transportc                 C   s   || j kr| jS d S N)r   r   )r   streamr   r   r   _get_close_waitero   s    
z*SubprocessStreamProtocol._get_close_waiter)r   
__module____qualname____doc__r   r$   r-   r0   r6   r8   r3   r<   __classcell__r   r   r   r   r
      s   	

r
   c                   @   sj   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdddZdS )Processc                 C   s8   || _ || _|| _|j| _|j| _|j| _| | _d S r:   )r   Z	_protocolr   r   r   r   Zget_pidpid)r   r,   r'   r   r   r   r   r   u   s    zProcess.__init__c                 C   s   d| j j d| j dS )N<r   >)r   r   rB   r7   r   r   r   r$   ~   s    zProcess.__repr__c                 C   s
   | j  S r:   )r   Zget_returncoder7   r   r   r   
returncode   s    zProcess.returncodec                    s   | j  I dH S )z?Wait until the process exit and return the process return code.N)r   Z_waitr7   r   r   r   wait   s    zProcess.waitc                 C   s   | j | d S r:   )r   send_signal)r   signalr   r   r   rG      s    zProcess.send_signalc                 C   s   | j   d S r:   )r   	terminater7   r   r   r   rI      s    zProcess.terminatec                 C   s   | j   d S r:   )r   killr7   r   r   r   rJ      s    zProcess.killc              
      s   | j  }| j| |r,td| t| z| j I d H  W n8 tt	fk
rx } z|rhtd| | W 5 d }~X Y nX |rtd|  | j
  d S )Nz%%r communicate: feed stdin (%s bytes)z%r communicate: stdin got %rz%r communicate: close stdin)r   	get_debugr   writer	   debugr9   ZdrainBrokenPipeErrorConnectionResetErrorr1   )r   inputrM   r4   r   r   r   _feed_stdin   s     
   zProcess._feed_stdinc                    s   d S r:   r   r7   r   r   r   _noop   s    zProcess._noopc                    s   | j |}|dkr| j}n|dks(t| j}| j rV|dkrDdnd}td| | |	 I d H }| j r|dkrzdnd}td| | |
  |S )Nr&   r   r   r   z%r communicate: read %sz%r communicate: close %s)r   r)   r   AssertionErrorr   r   rK   r	   rM   readr1   )r   r.   r,   r;   nameoutputr   r   r   _read_stream   s    

zProcess._read_streamNc                    s   |d k	r|  |}n|  }| jd k	r2| d}n|  }| jd k	rP| d}n|  }tj|||| jdI d H \}}}|  I d H  ||fS )Nr   r&   r   )	rQ   rR   r   rW   r   r   Zgatherr   rF   )r   rP   r   r   r   r   r   r   communicate   s    


zProcess.communicate)N)r   r=   r>   r   r$   propertyrE   rF   rG   rI   rJ   rQ   rR   rW   rX   r   r   r   r   rA   t   s   	
rA   c           
         sb   d krt  ntjdtdd  fdd}j|| f|||d|I d H \}}	t||	S )NZThe loop argument is deprecated since Python 3.8 and scheduled for removal in Python 3.10.r&   
stacklevelc                      s   t  dS Nr%   r
   r   r%   r   r   <lambda>   s   z)create_subprocess_shell.<locals>.<lambda>r   r   r   )r   get_event_loopwarningswarnDeprecationWarningZsubprocess_shellrA   )
cmdr   r   r   r   r   kwdsprotocol_factoryr,   r'   r   r%   r   r      s$    
 r   )r   r   r   r   r   c                   sf   d krt  ntjdtdd  fdd}j|| f||||d|I d H \}	}
t|	|
S )NrZ   r&   r[   c                      s   t  dS r]   r^   r   r%   r   r   r_      s   z(create_subprocess_exec.<locals>.<lambda>r`   )r   ra   rb   rc   rd   Zsubprocess_execrA   )Zprogramr   r   r   r   r   argsrf   rg   r,   r'   r   r%   r   r      s(    
 r   )__all__
subprocessrb    r   r   r   r   logr	   PIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr
   rA   Z_DEFAULT_LIMITr   r   r   r   r   r   <module>   s.   bV 
 