B
    ] ÇcV  ã               @   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	r‚tj| j| jd| _
| j
 |¡ | j 	d¡ | d¡}|d k	rªt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 |rŠt 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