
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \Ê  ã               @   sÈ   d dg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 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eddddejfdd„ƒZeddddejdœdd „ƒZdS )Úcreate_subprocess_execÚcreate_subprocess_shellé    Né   )Úevents)Ú	protocols)Ústreams)Útasks)Ú	coroutine)Ú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__© ú*/usr/lib64/python3.6/asyncio/subprocess.pyr      s    z!SubprocessStreamProtocol.__init__c             C   sf   | j jg}| jd k	r$|jd| j ƒ | jd k	r>|jd| j ƒ | jd k	rX|jd| j ƒ ddj|ƒ S )Nzstdin=%rz	stdout=%rz	stderr=%rz<%s>ú )r   Ú__name__r   Úappendr   r   Újoin)r   Úinfor   r   r   Ú__repr__   s    



z!SubprocessStreamProtocol.__repr__c             C   s®   || _ |jdƒ}|d k	rDtj| j| jd�| _| jj|ƒ | jj	dƒ |jdƒ}|d k	r‚tj| j| jd�| _
| j
j|ƒ | jj	dƒ |j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|j|ƒ 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|jƒ  | j|ƒ d S |dkr<| j}n|dkrL| j}nd }|d krt|d krj|jƒ  n
|j|ƒ || jkrŠ| jj|ƒ | 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_lostJ   s$    



z-SubprocessStreamProtocol.pipe_connection_lostc             C   s   d| _ | jƒ  d S )NT)r   r/   )r   r   r   r   Úprocess_exiteda   s    z'SubprocessStreamProtocol.process_exitedc             C   s(   t | jƒdkr$| jr$| jjƒ  d | _d S )Nr   )Úlenr   r   r   r-   )r   r   r   r   r/   e   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               @   s~   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZd	d
„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZedd„ ƒZeddd„ƒZdS )ÚProcessc             C   s8   || _ || _|| _|j| _|j| _|j| _|jƒ | _d S )N)r   Z	_protocolr&   r   r   r   Zget_pidÚpid)r   r(   r"   r   r   r   r   r   l   s    zProcess.__init__c             C   s   d| j j| jf S )Nz<%s %s>)r   r   r:   )r   r   r   r   r    u   s    zProcess.__repr__c             C   s
   | j jƒ S )N)r   Zget_returncode)r   r   r   r   Ú
returncodex   s    zProcess.returncodec             c   s   | j jƒ E dH S )zdWait until the process exit and return the process return code.

        This method is a coroutine.N)r   Z_wait)r   r   r   r   Úwait|   s    zProcess.waitc             C   s   | j j|ƒ d S )N)r   Úsend_signal)r   Úsignalr   r   r   r=   ƒ   s    zProcess.send_signalc             C   s   | j jƒ  d S )N)r   Ú	terminate)r   r   r   r   r?   †   s    zProcess.terminatec             C   s   | j jƒ  d S )N)r   Úkill)r   r   r   r   r@   ‰   s    zProcess.killc             c   s˜   | j jƒ }| jj|ƒ |r,tjd| t|ƒƒ y| jjƒ E d H  W n8 tt	fk
rx } z|rhtjd| |ƒ W Y d d }~X nX |rŠtjd| ƒ | j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   ÚinputrC   r0   r   r   r   Ú_feed_stdinŒ   s    
 zProcess._feed_stdinc             C   s   d S )Nr   )r   r   r   r   Ú_noopž   s    zProcess._noopc             c   s˜   | j j|ƒ}|dkr| j}n|dks(t‚| j}| jjƒ rV|dkrDdnd}tjd| |ƒ |j	ƒ E d H }| jjƒ rŒ|dkrzdnd}tjd| |ƒ |j
ƒ  |S )Nr!   r   r   r   z%r communicate: read %sz%r communicate: close %s)r   r$   r   ÚAssertionErrorr   r&   rA   r
   rC   Úreadr-   )r   r*   r(   ÚstreamÚnameÚoutputr   r   r   Ú_read_stream¢   s    

zProcess._read_streamNc             c   sŽ   |d k	r| j |ƒ}n| jƒ }| jd k	r2| jdƒ}n| jƒ }| jd k	rP| jdƒ}n| jƒ }tj|||| jd�E d H \}}}| jƒ E d H  ||fS )Nr   r!   )r   )	rG   rH   r   rN   r   r   Zgatherr&   r<   )r   rF   r   r   r   r   r   r   Úcommunicate´   s    


zProcess.communicate)N)r   r5   r6   r   r    Úpropertyr;   r	   r<   r=   r?   r@   rG   rH   rN   rO   r   r   r   r   r9   k   s   	r9   c       
      +   sP   ˆd krt jƒ ‰‡ ‡fdd„}ˆj|| f|||dœ|—ŽE 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   c            /   sT   ˆd krt jƒ ‰‡ ‡fdd„}ˆj|| f|ž|||dœ|—ŽE d H \}	}
t|	|
ˆƒS )Nc                  s   t ˆ ˆd�S )N)r   r   )r   r   )r   r   r   r   rQ   Û   s   z(create_subprocess_exec.<locals>.<lambda>)r   r   r   )r   rR   Zsubprocess_execr9   )Zprogramr   r   r   r   r   ÚargsrT   rU   r(   r"   r   )r   r   r   r   Õ   s    )Ú__all__Ú
subprocessÚ r   r   r   r   Z
coroutinesr	   Úlogr
   ÚPIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr   r9   Z_DEFAULT_LIMITr   r   r   r   r   r   Ú<module>   s(   X]