
    e                         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	 ddlm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZ  G d d	e      Zy# e$ r ddl	m	Z	m
Z
 Y /w xY w)
zJProvides an interface like pexpect.spawn interface using subprocess.Popen
    N)QueueEmpty   )	SpawnBasePY3)EOF)string_typesc                   b     e Zd Z	 	 	 d fd	ZdZd Zd Zd Zd Zd Z	ddZ
d	 Zd
 Zd Z xZS )
PopenSpawnc           	         t         t        |   ||||||	       |%t        j                  j                  d      | _        n$| j                  t        j                        | _        t        dt        j                  t        j                  t        j                  ||
|      }t        j                  dk(  rOt        j                         }|xj                  t        j                   z  c_        ||d<   t        j"                  |d<   t%        |t&              r;t        j                  dk7  r(t)        j*                  |t        j,                  dk(  	      }t        j.                  |fi || _        | j0                  j2                  | _        d
| _        | j                         | _        t9               | _        t=        j>                  | j@                        | _!        d| jB                  _"        | jB                  jG                          y )N)timeoutmaxreadsearchwindowsizelogfileencodingcodec_errorsasciir   )bufsizestdinstderrstdoutcwd
preexec_fnenvwin32startupinfocreationflagsposix)r   F)targetT)$superr   __init__oslinesepencodecrlfstring_typedict
subprocessPIPESTDOUTsysplatformSTARTUPINFOdwFlagsSTARTF_USESHOWWINDOWCREATE_NEW_PROCESS_GROUP
isinstancer	   shlexsplitnamePopenprocpidclosed_bufr   _read_queue	threadingThread_read_incoming_read_threaddaemonstart)selfcmdr   r   r   r   r   r   r   r   r   kwargsr   	__class__s                5/usr/lib/python3/dist-packages/pexpect/popen_spawn.pyr!   zPopenSpawn.__init__   s~    	j$('!17! 	) 	> 

))73DI(("**5DIaz'..z*#? <<7"$002K:#B#BB$/F=!&0&I&IF?#c<(S\\W-D++cG);<C$$S3F3	99==$$&	 7%,,D4G4GH#' !    Fc                 f   | j                   }| j                  r#|r||d  | _         |d | S d| _        t        d      |dk(  r| j                  }n|d}t        j
                         }t        j
                         |z
  |k  r|r~t        |      |k  rp	 | j                  j                         }|d| _        nK|| j                  j                  |d      z  }t        j
                         |z
  |k  r|rt        |      |k  rp|d | ||d  c}| _         | j                  |d       |S # t        $ r Y /w xY w)NTzEnd Of File (EOF).g    .AFfinalread)r9   _read_reached_eofflag_eofr   r   timelenr:   
get_nowait_decoderdecoder   _log)rA   sizer   buft0incomingrs          rE   read_nonblockingzPopenSpawn.read_nonblockingA   s7   ii!! J	5Dz! $.//b=llG_GYY[yy{R7*tC4	C++668 #-1D*t}}++HE+BB yy{R7*tC4 5Dz3tu:49		!V  s   D$ $	D0/D0c                 B   | j                   j                  j                         }	 d}	 t        j                  |d      }|s| j                  j                  d       y| j                  j                  |       S# t
        $ r}| j                  |d       Y d}~Zd}~ww xY w)z6Run in a thread to move output from a pipe to a queue.rF   i   rK   N)	r6   r   filenor"   rK   OSErrorrS   r:   put)rA   r[   rU   es       rE   r=   zPopenSpawn._read_incomingd   s    !!((*C%ggfd+   $$T*  %   %		!V$$%s   A9 9	BBBc                 &    | j                  |       y)zHThis is similar to send() except that there is no return value.
        Nsend)rA   ss     rE   writezPopenSpawn.writeu   s     			!rF   c                 4    |D ]  }| j                  |        y)zThis 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.
        Nr`   )rA   sequencerb   s      rE   
writelineszPopenSpawn.writelinesz   s      	AIIaL	rF   c                 8   | j                  |      }| j                  |d       | j                  j                  |d      }t        r%| j
                  j                  j                  |      S | j
                  j                  j                  |       t        |      S )zZSend data to the subprocess' stdin.

        Returns the number of bytes written.
        ra   FrI   )	_coerce_send_stringrS   _encoderr$   r   r6   r   rc   rO   )rA   rb   bs      rE   ra   zPopenSpawn.send   sx    
 $$Q'		!VMM  % 099??((++ IIOO!!!$q6MrF   c                 `    | j                  |      }|| j                  | j                        z   S )zWraps send(), sending string ``s`` to child process, with os.linesep
        automatically appended. Returns number of bytes written. )ra   r#   )rA   rb   ns      rE   sendlinezPopenSpawn.sendline   s)     IIaL499T\\***rF   c                     | j                   j                         }|dk\  r|| _        d| _        nd| _        | | _        d| _        |S )zKWait for the subprocess to finish.

        Returns the exit code.
        r   NT)r6   wait
exitstatussignalstatus
terminated)rA   statuss     rE   ro   zPopenSpawn.wait   sG    
 !Q;$DO $D"DO!'DrF   c                 j   t         j                  dk(  rv|t        j                  t        j                  fv rt        j                  }nC|t        j
                  t        j                  fv rt        j                  }nt        j                  }t        j                  | j                  j                  |       y)z}Sends a Unix signal to the subprocess.

        Use constants from the :mod:`signal` module to specify which signal.
        r   N)r+   r,   signalSIGINTCTRL_C_EVENTSIGBREAKCTRL_BREAK_EVENTSIGTERMr"   killr6   r7   )rA   sigs     rE   r{   zPopenSpawn.kill   ss    
 <<7"v}}f&9&9::))&*A*ABB--nn
		s#rF   c                 L    | j                   j                  j                          y)z+Closes the stdin pipe from the writing end.N)r6   r   close)rA   s    rE   sendeofzPopenSpawn.sendeof   s    		rF   )	   i  NNNNNstrictN) )__name__
__module____qualname__r!   rL   rY   r=   rc   rf   ra   rm   ro   r{   r   __classcell__)rD   s   @rE   r   r      sH    GK<@37("T !F&"
"+$ rF   r   )__doc__r"   r;   r(   r+   rN   ru   r2   queuer   r   ImportError	spawnbaser   r   
exceptionsr   utilsr	   r    rF   rE   <module>r      sW    	   
   #" &  h  h   #""#s   A AA