B
    ޜwaV                 @   s   d 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                   sP   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
  ZS )SubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.c                s<   t  j|d || _d  | _ | _| _d | _d| _g | _d S )N)loopF)	super__init___limitstdinstdoutstderr
_transport_process_exited	_pipe_fds)selflimitr   )	__class__ #lib/python3.7/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   _loopr   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_received?   s    z+SubprocessStreamProtocol.pipe_data_receivedc             C   s   |dkr,| j }|d k	r|  | | d S |dkr<| j}n|dkrL| j}nd }|d k	rt|d krj|  n
|| || jkr| j| | 	  d S )Nr   r   r!   )
r   closeZconnection_lostr   r   Zfeed_eofZset_exceptionr   remove_maybe_close_transport)r   r*   excpiper#   r   r   r   pipe_connection_lostI   s$    



z-SubprocessStreamProtocol.pipe_connection_lostc             C   s   d| _ |   d S )NT)r   r/   )r   r   r   r   process_exited`   s    z'SubprocessStreamProtocol.process_exitedc             C   s(   t | jdkr$| jr$| j  d | _d S )Nr   )lenr   r   r   r-   )r   r   r   r   r/   d   s    
z/SubprocessStreamProtocol._maybe_close_transport)r   
__module____qualname____doc__r   r    r)   r,   r2   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 )N)r   Z	_protocolr&   r   r   r   Zget_pidpid)r   r(   r"   r   r   r   r   r   k   s    zProcess.__init__c             C   s   d| j j d| j dS )N<r   >)r   r   r:   )r   r   r   r   r    t   s    zProcess.__repr__c             C   s
   | j  S )N)r   Zget_returncode)r   r   r   r   
returncodew   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_wait)r   r   r   r   wait{   s    zProcess.waitc             C   s   | j | d S )N)r   send_signal)r   signalr   r   r   r?      s    zProcess.send_signalc             C   s   | j   d S )N)r   	terminate)r   r   r   r   rA      s    zProcess.terminatec             C   s   | j   d S )N)r   kill)r   r   r   r   rB      s    zProcess.killc          
      s   | j  }| j| |r,td| t| y| j I d H  W n8 tt	fk
rx } z|rhtd| | W d 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	   debugr4   ZdrainBrokenPipeErrorConnectionResetErrorr-   )r   inputrE   r0   r   r   r   _feed_stdin   s    
 zProcess._feed_stdinc                s   d S )Nr   )r   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&   rC   r	   rE   readr-   )r   r*   r(   stream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   )	rI   rJ   r   rP   r   r   Zgatherr&   r>   )r   rH   r   r   r   r   r   r   communicate   s    


zProcess.communicate)N)r   r5   r6   r   r    propertyr=   r>   r?   rA   rB   rI   rJ   rP   rQ   r   r   r   r   r9   j   s   	r9   c       
         sP   d krt   fdd}j|| f|||d|I d H \}}	t||	S )Nc                  s   t  dS )N)r   r   )r
   r   )r   r   r   r   <lambda>   s   z)create_subprocess_shell.<locals>.<lambda>)r   r   r   )r   get_event_loopZsubprocess_shellr9   )
cmdr   r   r   r   r   kwdsprotocol_factoryr(   r"   r   )r   r   r   r      s    r   )r   r   r   r   r   c               sT   d krt   fdd}j|| f||||d|I d H \}	}
t|	|
S )Nc                  s   t  dS )N)r   r   )r
   r   )r   r   r   r   rS      s   z(create_subprocess_exec.<locals>.<lambda>)r   r   r   )r   rT   Zsubprocess_execr9   )Zprogramr   r   r   r   r   argsrV   rW   r(   r"   r   )r   r   r   r      s    r   )__all__
subprocess r   r   r   r   logr	   PIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr
   r9   Z_DEFAULT_LIMITr   r   r   r   r   r   <module>   s"   XV