ñÕYfÊã @s ddgZddlZddlmZddlmZddlmZddlmZdd lmZdd l m Z ej Z ej Z ej Z Gd d „d ejejƒZGd d„dƒZeddddejdd„ƒZedddddddddejdd„ƒ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 ‡S)ÚSubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.csRtƒjd|ƒ||_d|_|_|_d|_d|_g|_dS)NÚloopF) ÚsuperÚ__init__Ú_limitÚstdinÚstdoutÚstderrÚ _transportÚ_process_exitedÚ _pipe_fds)ÚselfÚlimitr )Ú __class__©ú7/opt/alt/python35/lib64/python3.5/asyncio/subprocess.pyrs    z!SubprocessStreamProtocol.__init__cCs‰|jjg}|jdk r2|jd|jƒ|jdk rU|jd|jƒ|jdk rx|jd|jƒddj|ƒS)Nzstdin=%rz stdout=%rz stderr=%rz<%s>ú )rÚ__name__rÚappendrrÚjoin)rÚinforrrÚ__repr__sz!SubprocessStreamProtocol.__repr__cCs||_|jdƒ}|dk retjd|jd|jƒ|_|jj|ƒ|jj dƒ|jdƒ}|dk rÁtjd|jd|jƒ|_ |j j|ƒ|jj dƒ|jdƒ}|dk rtj |d|ddd|jƒ|_ dS)Nrrr érÚprotocolÚreader) rÚget_pipe_transportrÚ StreamReaderrÚ_looprZ set_transportrrrÚ StreamWriterr)rÚ transportZstdout_transportZstderr_transportZstdin_transportrrrÚconnection_made(s&     z(SubprocessStreamProtocol.connection_madecCsS|dkr|j}n|dkr0|j}nd}|dk rO|j|ƒdS)Nrr!)rrZ feed_data)rÚfdÚdatar#rrrÚpipe_data_received@s     z+SubprocessStreamProtocol.pipe_data_receivedcCsÑ|dkr<|j}|dk r+|jƒ|j|ƒdS|dkrT|j}n|dkrl|j}nd}|dkr¤|dkr—|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_exitedas z'SubprocessStreamProtocol.process_exitedcCs8t|jƒdkr4|jr4|jjƒd|_dS)Nr)Úlenrrrr-)rrrrr/es z/SubprocessStreamProtocol._maybe_close_transport) rÚ __module__Ú __qualname__Ú__doc__rr r)r,r2r3r/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)ÚProcesscCsR||_||_||_|j|_|j|_|j|_|jƒ|_dS)N)rZ _protocolr&rrrZget_pidÚpid)rr(r"r rrrrls      zProcess.__init__cCsd|jj|jfS)Nz<%s %s>)rrr9)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ƒEdHWnDtt fk rš}z|rˆtjd||ƒ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ÚinputrBr0rrrÚ _feed_stdinŒs &zProcess._feed_stdincCsdS)Nr)rrrrÚ_noopžsz Process._noopccsØ|jj|ƒ}|dkr*|j}n|dks<t‚|j}|jjƒr|dkrfdnd}tjd||ƒ|j ƒEdH}|jjƒrÊ|dkr±dnd}tjd||ƒ|j ƒ|S)Nr!rrrz%r communicate: read %sz%r communicate: close %s) rr$rÚAssertionErrorrr&r@r rBÚreadr-)rr*r(ÚstreamÚnameÚoutputrrrÚ _read_stream¢s    zProcess._read_streamNccsÉ|dk r|j|ƒ}n |jƒ}|jdk rK|jdƒ}n |jƒ}|jdk rx|jdƒ}n |jƒ}tj|||d|jƒEdH\}}}|jƒEdH||fS)Nrr!r ) rFrGrrMrrZgatherr&r;)rrErrrrrrÚ communicate´s    zProcess.communicate)rr5r6rr Úpropertyr:r r;r<r>r?rFrGrMrNrrrrr8ks     r8c +soˆdkrtjƒ‰‡‡fdd†}ˆj||d|d|d||�EdH\}} t|| ˆƒS)NcstdˆdˆƒS)Nrr )r r)rr rrÚÍs z)create_subprocess_shell..rrr)rÚget_event_loopZsubprocess_shellr8) Úcmdrrrr rÚkwdsÚprotocol_factoryr(r"r)rr rrÈs  rrrr rc /srˆdkrtjƒ‰‡‡fdd†}ˆj|||d|d|d||ŽEdH\} } t| | ˆƒS)NcstdˆdˆƒS)Nrr )r r)rr rrrPÛs z(create_subprocess_exec..rrr)rrQZsubprocess_execr8) Zprogramrrrr rÚargsrSrTr(r"r)rr rrÕs    )Ú__all__Ú subprocessÚrrrrZ coroutinesr Úlogr ÚPIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr r8Z_DEFAULT_LIMITrrrrrrÚs(      X]