
-c`  ã               @   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 Gd d „  d e j e j ƒ Z Gd d „  d ƒ Z e d d d d e j d d „ ƒ Z e d d d d d d d d d e j d d  „ ƒ Z d S)Úcreate_subprocess_execÚcreate_subprocess_shellé    Né   )Úevents)Ú	protocols)Ústreams)Útasks)Ú	coroutine)Úloggerc                   sd   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	 ‡  S)ÚSubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.c                s@   t  ƒ  j d | ƒ | |  _ d  |  _ |  _ |  _ d  |  _ d  S)NÚloop)ÚsuperÚ__init__Ú_limitÚstdinÚstdoutÚstderrÚ
_transport)ÚselfÚlimitr   )Ú	__class__© ú(/usr/lib/python3.5/asyncio/subprocess.pyr      s    	z!SubprocessStreamProtocol.__init__c             C   s‰   |  j  j g } |  j d  k	 r2 | j d |  j ƒ |  j d  k	 rU | 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	 rU t j d |  j d |  j ƒ |  _ |  j j | ƒ | j d ƒ } | d  k	 r¡ t j d |  j d |  j ƒ |  _ |  j j | ƒ | j d ƒ } | d  k	 rã t j	 | d |  d d  d |  j ƒ|  _
 d  S)Nr   r   r   é   r   ÚprotocolÚreader)r   Úget_pipe_transportr   ÚStreamReaderr   Ú_loopr   Zset_transportr   ÚStreamWriterr   )r   Ú	transportZstdout_transportZstderr_transportZstdin_transportr   r   r   Úconnection_made&   s"    	z(SubprocessStreamProtocol.connection_madec             C   sS   | d k r |  j  } n | d k r0 |  j } n d  } | d  k	 rO | 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 rT |  j } n | d k rl |  j } n d  } | d  k r¤ | d  k r— | j ƒ  n | j | ƒ d  S)Nr   r   r   )r   ÚcloseZconnection_lostr   r   Zfeed_eofZset_exception)r   r(   ÚexcÚpiper!   r   r   r   Úpipe_connection_lostF   s    	
z-SubprocessStreamProtocol.pipe_connection_lostc             C   s   |  j  j ƒ  d  |  _  d  S)N)r   r+   )r   r   r   r   Úprocess_exitedY   s    z'SubprocessStreamProtocol.process_exited)
r   Ú
__module__Ú__qualname__Ú__doc__r   r   r'   r*   r.   r/   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   sR   | |  _  | |  _ | |  _ | 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   _   s    			zProcess.__init__c             C   s   d |  j  j |  j f S)Nz<%s %s>)r   r   r4   )r   r   r   r   r   h   s    zProcess.__repr__c             C   s   |  j  j ƒ  S)N)r   Zget_returncode)r   r   r   r   Ú
returncodek   s    zProcess.returncodec             c   s   |  j  j ƒ  Ed HS)zdWait until the process exit and return the process return code.

        This method is a coroutine.N)r   Z_wait)r   r   r   r   Úwaito   s    zProcess.waitc             C   s   |  j  j | ƒ d  S)N)r   Úsend_signal)r   Úsignalr   r   r   r7   v   s    zProcess.send_signalc             C   s   |  j  j ƒ  d  S)N)r   Ú	terminate)r   r   r   r   r9   y   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 ƒ  Ed  HWnD t t	 f k
 rš } z | rˆ t j d |  | ƒ WYd  d  } ~ Xn 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
   ÚdebugÚlenZdrainÚBrokenPipeErrorÚConnectionResetErrorr+   )r   Úinputr=   r,   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 ƒ  r | d k rf d n d } t j d |  | ƒ | j	 ƒ  Ed  H} |  j j ƒ  rÊ | d k r± d 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$   r;   r
   r=   Ú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	 rK |  j d ƒ } n |  j ƒ  } |  j d  k	 rx |  j d ƒ } n |  j ƒ  } t j | | | d |  j ƒEd  H\ } } } |  j ƒ  Ed  H| | f S)Nr   r   r   )	rB   rC   r   rI   r   r   Zgatherr$   r6   )r   rA   r   r   r   r   r   r   Úcommunicate§   s    zProcess.communicate)r   r0   r1   r   r   Úpropertyr5   r	   r6   r7   r9   r:   rB   rC   rI   rJ   r   r   r   r   r3   ^   s   	r3   c       
   
   +   so   ˆ d  k r t  j ƒ  ‰ ‡  ‡ f d d †  } ˆ j | |  d | d | d | | Ed  H\ } }	 t | |	 ˆ ƒ S)Nc                  s   t  d ˆ  d ˆ ƒ S)Nr   r   )r   r   )r   r   r   r   Ú<lambda>À   s   z)create_subprocess_shell.<locals>.<lambda>r   r   r   )r   Úget_event_loopZsubprocess_shellr3   )
Úcmdr   r   r   r   r   ÚkwdsÚprotocol_factoryr&   r    r   )r   r   r   r   »   s    r   r   r   r   r   c            /   sr   ˆ d  k r t  j ƒ  ‰ ‡  ‡ f d d †  } ˆ j | |  | d | d | d | | ŽEd  H\ }	 }
 t |	 |
 ˆ ƒ S)Nc                  s   t  d ˆ  d ˆ ƒ S)Nr   r   )r   r   )r   r   r   r   rL   Î   s   z(create_subprocess_exec.<locals>.<lambda>r   r   r   )r   rM   Zsubprocess_execr3   )Zprogramr   r   r   r   r   ÚargsrO   rP   r&   r    r   )r   r   r   r   È   s    	)Ú__all__Ú
subprocessÚ r   r   r   r   Z
coroutinesr	   Úlogr
   ÚPIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr   r3   Z_DEFAULT_LIMITr   r   r   r   r   r   Ú<module>   s(   			K]	