3 \Êã@sÈddgZddlZddlmZddlmZddlmZddlmZdd lmZdd l m Z ej Z ej Z ej Z Gd d „d ejejƒZGd d„dƒZeddddejfdd„ƒZeddddejdœdd„ƒZdS)Úcreate_subprocess_execÚcreate_subprocess_shelléNé)Úevents)Ú protocols)Ústreams)Útasks)Ú coroutine)ÚloggercsPeZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ‡Z S)ÚSubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.cs<tƒj|d�||_d|_|_|_d|_d|_g|_dS)N)ÚloopF) ÚsuperÚ__init__Ú_limitÚstdinÚstdoutÚstderrÚ _transportÚ_process_exitedÚ _pipe_fds)ÚselfÚlimitr )Ú __class__©ú*/usr/lib64/python3.6/asyncio/subprocess.pyrs z!SubprocessStreamProtocol.__init__cCsf|jjg}|jdk r$|jd|jƒ|jdk r>|jd|jƒ|jdk rX|jd|jƒddj|ƒS)Nzstdin=%rz stdout=%rz stderr=%rz<%s>ú )rÚ__name__rÚappendrrÚjoin)rÚinforrrÚ__repr__s    z!SubprocessStreamProtocol.__repr__cCs®||_|jdƒ}|dk rDtj|j|jd�|_|jj|ƒ|jj dƒ|jdƒ}|dk r‚tj|j|jd�|_ |j j|ƒ|jj dƒ|jdƒ}|dk rªtj ||d|jd�|_ dS)Nr)rr ér)ÚprotocolÚreaderr ) rÚget_pipe_transportrÚ StreamReaderrÚ_looprZ set_transportrrrÚ StreamWriterr)rÚ transportZstdout_transportZstderr_transportZstdin_transportrrrÚconnection_made(s&         z(SubprocessStreamProtocol.connection_madecCs:|dkr|j}n|dkr |j}nd}|dk r6|j|ƒdS)Nrr!)rrZ feed_data)rÚfdÚdatar#rrrÚpipe_data_received@sz+SubprocessStreamProtocol.pipe_data_receivedcCs–|dkr,|j}|dk r|jƒ|j|ƒdS|dkr<|j}n|dkrL|j}nd}|dkrt|dkrj|jƒn |j|ƒ||jkrŠ|jj|ƒ|j ƒdS)Nrrr!) rÚcloseZconnection_lostrrZfeed_eofZ set_exceptionrÚremoveÚ_maybe_close_transport)rr*ÚexcÚpiper#rrrÚpipe_connection_lostJs$     z-SubprocessStreamProtocol.pipe_connection_lostcCsd|_|jƒdS)NT)rr/)rrrrÚprocess_exitedasz'SubprocessStreamProtocol.process_exitedcCs(t|jƒdkr$|jr$|jjƒd|_dS)Nr)Úlenrrrr-)rrrrr/es z/SubprocessStreamProtocol._maybe_close_transport) rÚ __module__Ú __qualname__Ú__doc__rr r)r,r2r3r/Ú __classcell__rr)rrr s   r c@s~eZdZdd„Zdd„Zedd„ƒZedd„ƒZd d „Z d d „Z d d„Z edd„ƒZ edd„ƒZ edd„ƒZeddd„ƒZdS)ÚProcesscCs8||_||_||_|j|_|j|_|j|_|jƒ|_dS)N)rZ _protocolr&rrrZget_pidÚpid)rr(r"r rrrrlszProcess.__init__cCsd|jj|jfS)Nz<%s %s>)rrr:)rrrrr uszProcess.__repr__cCs |jjƒS)N)rZget_returncode)rrrrÚ returncodexszProcess.returncodeccs|jjƒEdHS)zdWait until the process exit and return the process return code. This method is a coroutine.N)rZ_wait)rrrrÚwait|sz Process.waitcCs|jj|ƒdS)N)rÚ send_signal)rÚsignalrrrr=ƒszProcess.send_signalcCs|jjƒdS)N)rÚ terminate)rrrrr?†szProcess.terminatecCs|jjƒdS)N)rÚkill)rrrrr@‰sz Process.killccs˜|jjƒ}|jj|ƒ|r,tjd|t|ƒƒy|jjƒEdHWn8tt fk rx}z|rhtjd||ƒWYdd}~XnX|rŠtjd|ƒ|jj ƒdS)Nz%%r communicate: feed stdin (%s bytes)z%r communicate: stdin got %rz%r communicate: close stdin) r&Ú get_debugrÚwriter Údebugr4ZdrainÚBrokenPipeErrorÚConnectionResetErrorr-)rÚinputrCr0rrrÚ _feed_stdinŒs     zProcess._feed_stdincCsdS)Nr)rrrrÚ_noopžsz Process._noopccsŒ|jj|ƒ}|dkr|j}n|j}|jjƒrJ|dkr8dnd}tjd||ƒ|jƒEdH}|jjƒr€|dkrndnd}tjd||ƒ|j ƒ|S)Nr!rrrz%r communicate: read %sz%r communicate: close %s) rr$rrr&rAr rCÚreadr-)rr*r(ÚstreamÚnameÚoutputrrrÚ _read_stream¢s   zProcess._read_streamNccsŽ|dk r|j|ƒ}n|jƒ}|jdk r2|jdƒ}n|jƒ}|jdk rP|jdƒ}n|jƒ}tj||||jd�EdH\}}}|jƒEdH||fS)Nrr!)r ) rGrHrrMrrZgatherr&r<)rrFrrrrrrÚ communicate´s      zProcess.communicate)N)rr5r6rr Úpropertyr;r r<r=r?r@rGrHrMrNrrrrr9ks      r9c +sPˆdkrtjƒ‰‡‡fdd„}ˆj||f|||dœ|—ŽEdH\}} t|| ˆƒS)Ncs tˆˆd�S)N)rr )r r)rr rrÚÍsz)create_subprocess_shell..)rrr)rÚget_event_loopZsubprocess_shellr9) Úcmdrrrr rÚkwdsÚprotocol_factoryr(r"r)rr rrÈs)rrrr rc /sTˆdkrtjƒ‰‡‡fdd„}ˆj||f|ž|||dœ|—ŽEdH\} } t| | ˆƒS)Ncs tˆˆd�S)N)rr )r r)rr rrrPÛsz(create_subprocess_exec..)rrr)rrQZsubprocess_execr9) Zprogramrrrr rÚargsrSrTr(r"r)rr rrÕs)Ú__all__Ú subprocessÚrrrrZ coroutinesr Úlogr ÚPIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr r9Z_DEFAULT_LIMITrrrrrrÚs(      X]