
\[\                 @   s<  d  d g 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 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)futures)	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                sd   t    j d |  | |  _ d  |  _ |  _ |  _ t j d |  |  _ t	 j
   |  _ d  |  _ d  S)Nloop)super__init___limitstdinstdoutstderrr   Futurewaitercollectionsdeque_waiters
_transport)selflimitr   )	__class__ (/usr/lib/python3.4/asyncio/subprocess.pyr      s    	z!SubprocessStreamProtocol.__init__c             C   s   |  j  j g } |  j d  k	 r5 | j d |  j  n  |  j d  k	 r[ | j d |  j  n  |  j d  k	 r | j d |  j  n  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  r< t j d |  j d |  j  |  _ n  | j d  ro t j d |  j d |  j  |  _ n  | j d  } | d  k	 r t j | d |  d d  d |  j |  _	 n  |  j
 j d   d  S)Nr   r   r      r   protocolreader)r   get_pipe_transportr   StreamReaderr   _loopr   r   StreamWriterr   r   
set_result)r   	transportr   r   r   r   connection_made*   s    	z(SubprocessStreamProtocol.connection_madec             C   sV   | d k r |  j  } n | d k r0 |  j } n d  } | d  k	 rR | j |  n  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   n  |  j |  d  S| d k rW |  j } n | d k ro |  j } n d  } | d  k r | d  k r | j   q | j |  n  d  S)Nr   r   r%   )r   closeZconnection_lostr   r   Zfeed_eofZset_exception)r   r/   excpiper'   r   r   r   pipe_connection_lostD   s    	z-SubprocessStreamProtocol.pipe_connection_lostc             C   s?   |  j  j   } x) |  j r: |  j j   } | j |  q Wd  S)N)r   get_returncoder   popleftr,   )r   
returncoder   r   r   r   process_exitedW   s    z'SubprocessStreamProtocol.process_exited)
r    
__module____qualname____doc__r   r$   r.   r1   r5   r9   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 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   	_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    r?   )r   r   r   r   r$   i   s    zProcess.__repr__c             C   s   |  j  j   S)N)r   r6   )r   r   r   r   r8   l   s    zProcess.returncodec             c   sZ   |  j  j   } | d k	 r | St j d |  j  } |  j j j |  | Dd H| j   S)z?Wait until the process exit and return the process return code.Nr   )	r   r6   r   r   r*   r>   r   r!   result)r   r8   r   r   r   r   waitp   s    	zProcess.waitc             C   s%   |  j  j   d  k	 r! t    n  d  S)N)r   r6   ProcessLookupError)r   r   r   r   _check_alive|   s    zProcess._check_alivec             C   s   |  j    |  j j |  d  S)N)rC   r   send_signal)r   signalr   r   r   rD      s    
zProcess.send_signalc             C   s   |  j    |  j j   d  S)N)rC   r   	terminate)r   r   r   r   rF      s    
zProcess.terminatec             C   s   |  j    |  j j   d  S)N)rC   r   kill)r   r   r   r   rG      s    
zProcess.killc             c   s   |  j  j   } |  j j |  | rA t j d |  t |   n  y |  j j   Dd  HWnG t t	 f k
 r } z! | r t j d |  |  n  WYd  d  } ~ Xn X| r t j d |   n  |  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ConnectionResetErrorr2   )r   inputrJ   r3   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 |  |  n  | j	   Dd  H} |  j j   r | d k r d n d } t j d |  |  n  | j
   | S)Nr%   r   r   r   z%r communicate: read %sz%r communicate: close %s)r   r(   r   AssertionErrorr   r*   rH   r   rJ   readr2   )r   r/   r-   streamnameoutputr   r   r   _read_stream   s    	
zProcess._read_streamNc             c   s   | r |  j  |  } n |  j   } |  j d  k	 rE |  j d  } n |  j   } |  j d  k	 rr |  j d  } n |  j   } t j | | | d |  j Dd  H\ } } } |  j   Dd  H| | f S)Nr   r%   r   )	rO   rP   r   rV   r   r	   Zgatherr*   rA   )r   rN   r   r   r   r   r   r   communicate   s    zProcess.communicate)r    r:   r;   r   r$   propertyr8   r
   rA   rC   rD   rF   rG   rO   rP   rV   rW   r   r   r   r   r=   _   s   	r=   c       
   
   +   s~    d  k r t  j    n     f d d   }  j | |  d | d | d | | Dd  H\ } }	 |	 j Dd  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_shellr   r=   )
cmdr   r   r   r   r   kwdsprotocol_factoryr-   r&   r   )r   r   r   r      s    r   r   r   r   r   c            /   s    d  k r t  j    n     f d d   }  j | |  d | d | d | | | Dd  H\ }	 }
 |
 j Dd  Ht |	 |
   S)Nc                  s   t  d   d   S)Nr   r   )r   r   )r   r   r   r   rY      s   z(create_subprocess_exec.<locals>.<lambda>r   r   r   )r   rZ   Zsubprocess_execr   r=   )Zprogramr   r   r   r   r   argsr\   r]   r-   r&   r   )r   r   r   r      s    )__all__r   
subprocess r   r   r   r   r	   Z
coroutinesr
   logr   PIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr   r=   Z_DEFAULT_LIMITr   r   r   r   r   r   <module>   s,   			Ji	