o
    !^                     @   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z
ddlm	Z	m
Z
 W n ey9   ddl	m	Z	m
Z
 Y nw 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                       sr   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 u rtjd| _n| tj| _tdt	j
t	jt	j
||
|d}tjdkrIt	 }| jt	jO  _||d< t	j|d< t|tr]tjdkr]tj|tjdkd	}t	j|fi || _| 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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	setDaemonstart)selfcmdr   r   r   r   r   r   r   r   r   kwargsr   	__class__ 5/usr/lib/python3/dist-packages/pexpect/popen_spawn.pyr!      s4   



zPopenSpawn.__init__Fc                 C   s  | j }| jr|r||d  | _ |d | S d| _td|dkr$| j}n|d u r*d}t }t | |k rq|rqt||k rqz| j }W n	 t	yN   Y n#w |d u rWd| _n|| j
j|dd7 }t | |k rq|rqt||k s>|d | ||d  }| _ | |d |S )NTzEnd Of File (EOF).g    .AFfinalread)r9   _read_reached_eofflag_eofr   r   timelenr:   
get_nowaitr   _decoderdecode_log)rA   sizer   buft0incomingrrF   rF   rG   read_nonblockingA   s4     zPopenSpawn.read_nonblockingc              
   C   sv   | j j }	 d}zt|d}W n ty) } z| |d W Y d}~nd}~ww |s4| jd dS | j| q)z6Run in a thread to move output from a pipe to a queue.r       i   rK   N)	r6   r   filenor"   rK   OSErrorrS   r:   put)rA   r[   rU   erF   rF   rG   r=   d   s   zPopenSpawn._read_incomingc                 C   s   |  | dS )zHThis is similar to send() except that there is no return value.
        Nsend)rA   srF   rF   rG   writeu   s   zPopenSpawn.writec                 C   s   |D ]}|  | q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.
        Nr_   )rA   sequencera   rF   rF   rG   
writelinesz   s   zPopenSpawn.writelinesc                 C   sN   |  |}| |d | jj|dd}tr| jj|S | jj| t|S )zZSend data to the subprocess' stdin.

        Returns the number of bytes written.
        r`   FrI   )	_coerce_send_stringrS   _encoderr$   r   r6   r   rb   rO   )rA   ra   brF   rF   rG   r`      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. )r`   r#   )rA   ra   nrF   rF   rG   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)r6   wait
exitstatussignalstatus
terminated)rA   statusrF   rF   rG   rk      s   
zPopenSpawn.waitc                 C   sT   t jdkr |tjtjfv rtj}n|tjtjfv 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SIGINTCTRL_C_EVENTSIGBREAKCTRL_BREAK_EVENTSIGTERMr"   killr6   r7   )rA   sigrF   rF   rG   rv      s   
zPopenSpawn.killc                 C   s   | j j  dS )z+Closes the stdin pipe from the writing end.N)r6   r   close)rA   rF   rF   rG   sendeof   s   zPopenSpawn.sendeof)	r
   r   NNNNNr   N)rh   )__name__
__module____qualname__r!   rL   rY   r=   rb   rd   r`   rj   rk   rv   ry   __classcell__rF   rF   rD   rG   r	      s    *#

r	   )__doc__r"   r;   r(   r+   rN   rp   r2   queuer   r   ImportError	spawnbaser   r   
exceptionsr   utilsr   r	   rF   rF   rF   rG   <module>   s"    