ó
Pñ`cc           @   sî   d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z y d d l m	 Z	 m
 Z
 Wn' e k
 r d d l	 m	 Z	 m
 Z
 n Xd d l m Z m Z d d l m Z d d l m Z d e f d	 „  ƒ  YZ d S(
   sJ   Provides an interface like pexpect.spawn interface using subprocess.Popen
iÿÿÿÿN(   t   Queuet   Emptyi   (   t	   SpawnBaset   PY3(   t   EOF(   t   string_typest
   PopenSpawnc        
   B   s†   e  Z d  d d d d d d d d d „	 Z e Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 d
 „ Z d „  Z d „  Z d „  Z RS(   i   iÐ  t   strictc         C   s³  t  t |  ƒ j d | d | d | d | d | d |	 ƒ | d  k r[ t j j d ƒ |  _ n |  j t j ƒ |  _ t	 d d	 d
 t
 j d t
 j d t
 j d | d |
 d | ƒ } t j d k ró t
 j ƒ  } | j t
 j O_ | | d <t
 j | d <n  t | t ƒ r2t j d k r2t j | d t j d k ƒ} n  t
 j | |  |  _ |  j j |  _ t |  _ |  j ƒ  |  _ t ƒ  |  _ t  j! d |  j" ƒ |  _# |  j# j$ t% ƒ |  j# j& ƒ  d  S(   Nt   timeoutt   maxreadt   searchwindowsizet   logfilet   encodingt   codec_errorst   asciit   bufsizei    t   stdint   stderrt   stdoutt   cwdt
   preexec_fnt   envt   win32t   startupinfot   creationflagst   posixt   target('   t   superR   t   __init__t   Nonet   ost   linesept   encodet   crlft   string_typet   dictt
   subprocesst   PIPEt   STDOUTt   syst   platformt   STARTUPINFOt   dwFlagst   STARTF_USESHOWWINDOWt   CREATE_NEW_PROCESS_GROUPt
   isinstanceR   t   shlext   splitt   namet   Popent   proct   pidt   Falset   closedt   _bufR    t   _read_queuet	   threadingt   Threadt   _read_incomingt   _read_threadt	   setDaemont   Truet   start(   t   selft   cmdR   R	   R
   R   R   R   R   R   R   t   kwargsR   (    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyR      s0    	
!	c         C   s<  |  j  } |  j rE | r- | | |  _  | |  St |  _ t d ƒ ‚ n  | d k r] |  j } n | d  k rr d } n  t j ƒ  } x t j ƒ  | | k  r| rt | ƒ | k  ry |  j	 j
 ƒ  } Wn t k
 rÖ Pq X| d  k rð t |  _ Pn  | |  j j | d t ƒ7} q W| |  | | } |  _  |  j | d ƒ | S(   Ns   End Of File (EOF).iÿÿÿÿg    €„.At   finalt   read(   R6   t   _read_reached_eofR=   t   flag_eofR   R   R   t   timet   lenR7   t
   get_nowaitR   t   _decodert   decodeR4   t   _log(   R?   t   sizeR   t   buft   t0t   incomingt   r(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyt   read_nonblockingA   s0    				1	 c         C   s‰   |  j  j j ƒ  } xp d } y t j | d ƒ } Wn# t k
 rV } |  j | d ƒ n X| sq |  j j d ƒ d S|  j j | ƒ q Wd S(   s6   Run in a thread to move output from a pipe to a queue.t    i   RC   N(
   R2   R   t   filenoR   RC   t   OSErrorRK   R7   t   putR   (   R?   RS   RM   t   e(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyR:   d   s    c         C   s   |  j  | ƒ d S(   sH   This is similar to send() except that there is no return value.
        N(   t   send(   R?   t   s(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyt   writeu   s    c         C   s"   x | D] } |  j  | ƒ q Wd S(   së   This calls write() for each element in the sequence.

        The sequence can be any iterable object producing strings, typically a
        list of strings. This does not add line separators. There is no return
        value.
        N(   RW   (   R?   t   sequenceRX   (    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyt
   writelinesz   s    c         C   sq   |  j  | ƒ } |  j | d ƒ |  j j | d t ƒ} t rP |  j j j | ƒ S|  j j j | ƒ t	 | ƒ Sd S(   sZ   Send data to the subprocess' stdin.

        Returns the number of bytes written.
        RW   RB   N(
   t   _coerce_send_stringRK   t   _encoderR    R4   R   R2   R   RY   RG   (   R?   RX   t   b(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyRW   „   s    RR   c         C   s#   |  j  | ƒ } | |  j  |  j ƒ S(   s†   Wraps send(), sending string ``s`` to child process, with os.linesep
        automatically appended. Returns number of bytes written. (   RW   R   (   R?   RX   t   n(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyt   sendline•   s    c         C   sP   |  j  j ƒ  } | d k r0 | |  _ d |  _ n d |  _ | |  _ t |  _ | S(   sK   Wait for the subprocess to finish.

        Returns the exit code.
        i    N(   R2   t   waitt
   exitstatusR   t   signalstatusR=   t
   terminated(   R?   t   status(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyRa   œ   s    		
	c         C   s}   t  j d k rc | t j t j g k r3 t j } qc | t j t j g k rW t j } qc t j } n  t j	 |  j
 j | ƒ d S(   s}   Sends a Unix signal to the subprocess.

        Use constants from the :mod:`signal` module to specify which signal.
        R   N(   R'   R(   t   signalt   SIGINTt   CTRL_C_EVENTt   SIGBREAKt   CTRL_BREAK_EVENTt   SIGTERMR   t   killR2   R3   (   R?   t   sig(    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyRl   «   s    c         C   s   |  j  j j ƒ  d S(   s+   Closes the stdin pipe from the writing end.N(   R2   R   t   close(   R?   (    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyt   sendeofº   s    N(   t   __name__t
   __module__R   R   R4   RD   RQ   R:   RY   R[   RW   R`   Ra   Rl   Ro   (    (    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyR      s   	(	#			
			(   t   __doc__R   R8   R$   R'   RF   Rf   R.   t   queueR    R   t   ImportErrort	   spawnbaseR   R   t
   exceptionsR   t   utilsR   R   (    (    (    s2   lib/python2.7/site-packages/pexpect/popen_spawn.pyt   <module>   s   