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 )zë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.
        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 )z†Wraps 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"    ÿ