a !^@sdZddlZddlZddlZddlZddlZddlZddlZzddlm Z m Z Wn"e yrddl m Z m Z Yn0ddl m Z mZddlmZddlmZGdd d e ZdS) zJProvides an interface like pexpect.spawn interface using subprocess.Popen N)QueueEmpty) SpawnBasePY3)EOF) string_typesc sleZdZdfdd ZdZdd Zd d Zd d ZddZddZ dddZ ddZ ddZ ddZ ZS) PopenSpawnNstrictc stt|j|||||| d|dur4tjd|_n|tj|_tdt j t j t j || |d} t j dkrt } | jt jO_| | d<t j| d<t|trt j dkrtj|tjdkd }t j|fi| |_|jj|_d |_||_t|_tj|j d |_!|j!"d |j!#dS) N)timeoutmaxreadsearchwindowsizelogfileencoding codec_errorsasciir)bufsizestdinstderrstdoutcwd preexec_fnenvwin32 startupinfoZ creationflagsposix)rF)targetT)$superr __init__oslinesepencodeZcrlfZ string_typedict subprocessPIPEZSTDOUTsysplatformZ STARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWZCREATE_NEW_PROCESS_GROUP isinstancershlexsplitnamePopenprocpidclosed_bufr _read_queue threadingThread_read_incomingZ _read_thread setDaemonstart) selfcmdr rrrrrrrrkwargsr __class__7/usr/lib/python3.9/site-packages/pexpect/popen_spawn.pyr s4      zPopenSpawn.__init__FcCs|j}|jr8|r*||d|_|d|Sd|_td|dkrH|j}n |durTd}t}t||kr|rt||krz|j}Wnt yYqYq\0|durd|_q||j j |dd7}q\|d|||d}|_| |d|S)NTzEnd Of File (EOF).g.AFfinalread) r1_read_reached_eofZflag_eofrr timelenr2Z get_nowaitrZ_decoderdecode_log)r8sizer bufZt0Zincomingrr=r=r>read_nonblockingAs0     zPopenSpawn.read_nonblockingc Csx|jj}d}zt|d}Wn0tyP}z||dWYd}~n d}~00|sf|jddS|j|q dS)z6Run in a thread to move output from a pipe to a queue.irBN) r.rfilenor!rBOSErrorrGr2Zput)r8rMrIer=r=r>r5ds " zPopenSpawn._read_incomingcCs||dS)zHThis is similar to send() except that there is no return value. Nsend)r8sr=r=r>writeuszPopenSpawn.writecCs|D]}||qdS)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. NrP)r8ZsequencerRr=r=r> writelineszszPopenSpawn.writelinescCsR||}||d|jj|dd}tr8|jj|S|jj|t|SdS)zZSend data to the subprocess' stdin. Returns the number of bytes written. rQFr@N) Z_coerce_send_stringrGZ_encoderr#rr.rrSrE)r8rRbr=r=r>rQs  zPopenSpawn.sendcCs||}|||jS)zWraps send(), sending string ``s`` to child process, with os.linesep automatically appended. Returns number of bytes written. )rQr")r8rRnr=r=r>sendlines zPopenSpawn.sendlinecCs8|j}|dkr ||_d|_nd|_| |_d|_|S)zKWait for the subprocess to finish. Returns the exit code. rNT)r.waitZ exitstatusZ signalstatusZ terminated)r8statusr=r=r>rYs zPopenSpawn.waitcCsTtjdkr@|tjtjfvr"tj}n|tjtjfvr:tj}ntj}t |j j |dS)z}Sends a Unix signal to the subprocess. Use constants from the :mod:`signal` module to specify which signal. rN) r'r(signalSIGINTZ CTRL_C_EVENTZSIGBREAKZCTRL_BREAK_EVENTSIGTERMr!killr.r/)r8Zsigr=r=r>r^s zPopenSpawn.killcCs|jjdS)z+Closes the stdin pipe from the writing end.N)r.rclose)r8r=r=r>sendeofszPopenSpawn.sendeof) r r NNNNNr N)rV)__name__ __module__ __qualname__r rCrKr5rSrTrQrXrYr^r` __classcell__r=r=r;r>r s*#  r )__doc__r!r3r%r'rDr[r*Zqueuerr ImportErrorZ spawnbaserr exceptionsrZutilsrr r=r=r=r>s