ó
æNXc           @   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 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   EOFt
   PopenSpawnc        	   B   s¡   e  Z e r d  j d ƒ Z n d  Z 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(   s   
t   asciii   iÐ  t   strictc
         C   sM  t  t |  ƒ j d | d | d | d | d | d |	 ƒ t d d d	 t j d
 t j d t j d | d | ƒ }
 t j d k r´ t j	 ƒ  } | j
 t j O_
 | |
 d <t j |
 d <n  t | t t f ƒ sÛ t j | ƒ } n  t j | |
  |  _ t |  _ |  j ƒ  |  _ t ƒ  |  _ t j d |  j ƒ |  _ |  j j t ƒ |  j j  ƒ  d  S(   Nt   timeoutt   maxreadt   searchwindowsizet   logfilet   encodingt   codec_errorst   bufsizei    t   stdint   stderrt   stdoutt   cwdt   envt   win32t   startupinfot   creationflagst   target(!   t   superR   t   __init__t   dictt
   subprocesst   PIPEt   STDOUTt   syst   platformt   STARTUPINFOt   dwFlagst   STARTF_USESHOWWINDOWt   CREATE_NEW_PROCESS_GROUPt
   isinstancet   listt   tuplet   shlext   splitt   Popent   proct   Falset   closedt   string_typet   _bufR    t   _read_queuet	   threadingt   Threadt   _read_incomingt   _read_threadt	   setDaemont   Truet   start(   t   selft   cmdR   R	   R
   R   R   R   R   R   t   kwargsR   (    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyR      s(    
	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(   R.   t   _read_reached_eofR5   t   flag_eofR   R   t   Nonet   timet   lenR/   t
   get_nowaitR   t   _decodert   decodeR+   t   _log(   R7   t   sizeR   t   buft   t0t   incomingt   r(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyt   read_nonblocking8   s0    				1	 c         C   sˆ   |  j  j j ƒ  } xo d } y t j | d ƒ } Wn# t k
 rV } |  j | d ƒ n X| sq |  j j d ƒ d S|  j j | ƒ q d S(   s6   Run in a thread to move output from a pipe to a queue.t    i   R;   N(
   R*   R   t   filenot   osR;   t   OSErrorRD   R/   t   putR>   (   R7   RL   RF   t   e(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyR2   [   s    c         C   s   |  j  | ƒ d S(   sH   This is similar to send() except that there is no return value.
        N(   t   send(   R7   t   s(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyt   writel   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(   RQ   (   R7   t   sequenceRR   (    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyt
   writelinesq   s    c         C   sq   |  j  | ƒ } |  j | d ƒ |  j j | d t ƒ} t rP |  j j j | ƒ S|  j j j | ƒ t	 | ƒ Sd S(   sb   Send data to the subprocess' stdin.
        
        Returns the number of bytes written.
        RQ   R:   N(
   t   _coerce_send_stringRD   t   _encodert   encodeR+   R   R*   R   RS   R@   (   R7   RR   t   b(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyRQ   {   s    RK   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. (   RQ   t   linesep(   R7   RR   t   n(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyt   sendlineŒ   s    c         C   sP   |  j  j ƒ  } | d k r0 | |  _ d |  _ n d |  _ | |  _ t |  _ | S(   sS   Wait for the subprocess to finish.
        
        Returns the exit code.
        i    N(   R*   t   waitt
   exitstatusR>   t   signalstatusR5   t
   terminated(   R7   t   status(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyR]   “   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   SIGTERMRM   t   killR*   t   pid(   R7   t   sig(    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyRh   ¢   s    c         C   s   |  j  j j ƒ  d S(   s+   Closes the stdin pipe from the writing end.N(   R*   R   t   close(   R7   (    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyt   sendeof±   s    N(   t   __name__t
   __module__R   RX   t   crlfR>   R   R+   R<   RJ   R2   RS   RU   RQ   R\   R]   Rh   Rl   (    (    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyR      s    		#			
			(   t   __doc__RM   R0   R   R   R?   Rb   R'   t   queueR    R   t   ImportErrort	   spawnbaseR   R   t
   exceptionsR   R   (    (    (    sK   /data/av2000/mvv/env_mvv/lib/python2.7/site-packages/pexpect/popen_spawn.pyt   <module>   s   