dbfdg 3 .]! @sdZddlZddlZddlZddlZddlZddlZddlZyddlm Z m Z Wn$e k rtddl m Z m Z YnXddl m Z mZddlmZddlmZGdd d e ZdS) zJProvides an interface like pexpect.spawn interface using subprocess.Popen N)QueueEmpty) SpawnBasePY3)EOF) string_typescseZdZerdjdZndZdfdd Zd Zd d Zd d Z ddZ ddZ ddZ dddZ ddZddZddZZS) PopenSpawn asciiNstrictc stt|j|||||| dtdtjtjtj||d} tjdkrjtj } | j tj O_ | | d<tj | d<t |trtjdkrtj|tjdkd}tj|f| |_|jj|_d |_|j|_t|_tj|jd |_|jjd |jj dS) N)timeoutmaxreadsearchwindowsizelogfileencoding codec_errorsr)bufsizestdinstderrstdoutcwdenvwin32 startupinfoZ creationflagsposix)rF)targetT)!superr __init__dict subprocessPIPEZSTDOUTsysplatformZ STARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWZCREATE_NEW_PROCESS_GROUP isinstancershlexsplitosnamePopenprocpidclosedZ string_type_bufr _read_queue threadingZThread_read_incomingZ _read_threadZ setDaemonstart) selfcmdrrrrrrrrkwargsr) __class__!/usr/lib/python3.6/popen_spawn.pyr s*       zPopenSpawn.__init__Fc Cs|j}|jr8|r*||d|_|d|Sd|_td|dkrH|j}n |dkrTd}tj}xntj||kr|rt||kry|jj}Wnt k rPYq^X|dkrd|_P||j j |dd7}q^W|d|||d}|_|j |d|S) NTzEnd Of File (EOF).rg.AF)finalread) r/_read_reached_eofZflag_eofrrtimelenr0Z get_nowaitrZ_decoderdecode_log)r4sizerbufZt0Zincomingrr8r8r9read_nonblocking:s0 " zPopenSpawn.read_nonblockingcCsz|jjj}xhd}ytj|d}Wn.tk rP}z|j|dWYdd}~XnX|sf|jjddS|jj|qWdS)z6Run in a thread to move output from a pipe to a queue.ir;N) r,rfilenor)r;OSErrorrAr0Zput)r4rGrCer8r8r9r2]s  zPopenSpawn._read_incomingcCs|j|dS)zHThis is similar to send() except that there is no return value. N)send)r4sr8r8r9writenszPopenSpawn.writecCsx|D]}|j|qWdS)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)rJ)r4ZsequencerKr8r8r9 writelinesss zPopenSpawn.writelinescCsR|j|}|j|d|jj|dd}tr8|jjj|S|jjj|t|SdS)zbSend data to the subprocess' stdin. Returns the number of bytes written. rJF)r:N) Z_coerce_send_stringrAZ_encoderencoderr,rrLr?)r4rKbr8r8r9rJ}s  zPopenSpawn.sendcCs|j|}||j|jS)zWraps send(), sending string ``s`` to child process, with os.linesep automatically appended. Returns number of bytes written. )rJlinesep)r4rKnr8r8r9sendlines zPopenSpawn.sendlinecCs8|jj}|dkr ||_d|_nd|_| |_d|_|S)zSWait for the subprocess to finish. Returns the exit code. rNT)r,waitZ exitstatusZ signalstatusZ terminated)r4Zstatusr8r8r9rTs zPopenSpawn.waitcCsTtjdkr@|tjtjgkr"tj}n|tjtjgkr:tj}ntj}tj |j j |dS)zSends 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-)r4Zsigr8r8r9rXs zPopenSpawn.killcCs|jjjdS)z+Closes the stdin pipe from the writing end.N)r,rclose)r4r8r8r9sendeofszPopenSpawn.sendeof)r r NNNNNr)rP)__name__ __module__ __qualname__rrNZcrlfr r=rEr2rLrMrJrSrTrXrZ __classcell__r8r8)r7r9r s  #  r )__doc__r)r1r"r$r>rUr'Zqueuerr ImportErrorZ spawnbaserr exceptionsrZutilsrr r8r8r8r9s