B
    c<[                 @   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
 W n$ ek
rt   ddl	m	Z	m
Z
 Y nX ddlmZmZ ddlmZ ddlmZ G dd	 d	eZdS )
zJProvides an interface like pexpect.spawn interface using subprocess.Popen
    N)QueueEmpty   )	SpawnBasePY3)EOF)string_typesc            	       sl   e Zd Zd fdd	ZdZdd	 Zd
d Zdd Zdd Zdd Z	dddZ
dd Zdd Zdd Z  ZS )
PopenSpawn     Nstrictc          	      s  t t| j||||||	d |d kr4tjd| _n| tj| _tdt	j
t	jt	j
||
|d}tjdkrt	 }| jt	jO  _||d< t	j|d< t|trtjdkrtj|tjdkd	}t	j|f|| _| jj| _d
| _|  | _t | _tj| j d| _!| j!"d | j!#  d S )N)timeoutmaxreadsearchwindowsizelogfileencodingcodec_errorsasciir   )bufsizestdinstderrstdoutcwd
preexec_fnenvwin32startupinfoZcreationflagsposix)r   F)targetT)$superr	   __init__oslinesepencodeZcrlfZstring_typedict
subprocessPIPEZSTDOUTsysplatformZSTARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWZCREATE_NEW_PROCESS_GROUP
isinstancer   shlexsplitnamePopenprocpidclosed_bufr   _read_queue	threadingZThread_read_incomingZ_read_threadZ	setDaemonstart)selfcmdr   r   r   r   r   r   r   r   r   kwargsr   )	__class__ 2lib/python3.7/site-packages/pexpect/popen_spawn.pyr       s0    
	



zPopenSpawn.__init__Fc             C   s   | j }| jr8|r*||d  | _ |d | S d| _td|dkrH| j}n|d krTd}t }xnt | |k r|rt||k ry| j }W n t	k
r   P Y q^X |d krd| _P || j
j|dd7 }q^W |d | ||d   }| _ | |d |S )NTzEnd Of File (EOF).g    .AF)finalread)r1   _read_reached_eofZflag_eofr   r   timelenr2   Z
get_nowaitr   Z_decoderdecode_log)r6   sizer   bufZt0Zincomingrr:   r:   r;   read_nonblockingA   s0    "zPopenSpawn.read_nonblockingc          
   C   sz   | j j }xhd}yt|d}W n. tk
rP } z| |d W dd}~X Y nX |sf| jd dS | j| qW dS )z6Run in a thread to move output from a pipe to a queue.    i   r>   N)	r.   r   filenor!   r>   OSErrorrC   r2   Zput)r6   rI   rE   er:   r:   r;   r4   d   s    zPopenSpawn._read_incomingc             C   s   |  | dS )zHThis is similar to send() except that there is no return value.
        N)send)r6   sr:   r:   r;   writeu   s    zPopenSpawn.writec             C   s   x|D ]}|  | qW dS )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.
        N)rL   )r6   ZsequencerM   r:   r:   r;   
writelinesz   s    
zPopenSpawn.writelinesc             C   sR   |  |}| |d | jj|dd}tr8| jj|S | jj| t|S dS )zZSend data to the subprocess' stdin.

        Returns the number of bytes written.
        rL   F)r=   N)	Z_coerce_send_stringrC   Z_encoderr#   r   r.   r   rN   rA   )r6   rM   br:   r:   r;   rL      s    
zPopenSpawn.send c             C   s   |  |}||  | j S )zWraps send(), sending string ``s`` to child process, with os.linesep
        automatically appended. Returns number of bytes written. )rL   r"   )r6   rM   nr:   r:   r;   sendline   s    
zPopenSpawn.sendlinec             C   s8   | j  }|dkr || _d| _nd| _| | _d| _|S )zKWait for the subprocess to finish.

        Returns the exit code.
        r   NT)r.   waitZ
exitstatusZsignalstatusZ
terminated)r6   Zstatusr:   r:   r;   rT      s    
zPopenSpawn.waitc             C   sT   t jdkr@|tjtjgkr"tj}n|tjtjgkr:tj}ntj}t	| j
j| dS )z}Sends a Unix signal to the subprocess.

        Use constants from the :mod:`signal` module to specify which signal.
        r   N)r'   r(   signalSIGINTZCTRL_C_EVENTZSIGBREAKZCTRL_BREAK_EVENTSIGTERMr!   killr.   r/   )r6   Zsigr:   r:   r;   rX      s    
zPopenSpawn.killc             C   s   | j j  dS )z+Closes the stdin pipe from the writing end.N)r.   r   close)r6   r:   r:   r;   sendeof   s    zPopenSpawn.sendeof)	r
   r   NNNNNr   N)rQ   )__name__
__module____qualname__r    r?   rG   r4   rN   rO   rL   rS   rT   rX   rZ   __classcell__r:   r:   )r9   r;   r	      s     (#

r	   )__doc__r!   r3   r%   r'   r@   rU   r*   Zqueuer   r   ImportErrorZ	spawnbaser   r   
exceptionsr   Zutilsr   r	   r:   r:   r:   r;   <module>   s   