Yf @s ddgZddlZddlmZddlmZddlmZddlmZdd lmZdd l m Z ej Z ej Z ej Z Gd d d ejejZGd ddZeddddejddZedddddddddejddZdS)create_subprocess_execcreate_subprocess_shellN)events) protocols)streams)tasks) coroutine)loggercspeZdZdZfddZddZddZdd Zd d Zd d Z ddZ S)SubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.csRtjd|||_d|_|_|_d|_d|_g|_dS)NloopF) super__init___limitstdinstdoutstderr _transport_process_exited _pipe_fds)selflimitr ) __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|jddj|S)Nzstdin=%rz stdout=%rz stderr=%rz<%s> )r__name__rappendrrjoin)rinforrr__repr__sz!SubprocessStreamProtocol.__repr__cCs||_|jd}|dk retjd|jd|j|_|jj||jj d|jd}|dk rtjd|jd|j|_ |j j||jj d|jd}|dk rtj |d|ddd|j|_ dS)Nrrr rprotocolreader) rget_pipe_transportr StreamReaderr_looprZ set_transportrrr StreamWriterr)r transportZstdout_transportZstderr_transportZstdin_transportrrrconnection_made(s&     z(SubprocessStreamProtocol.connection_madecCsS|dkr|j}n|dkr0|j}nd}|dk rO|j|dS)Nrr!)rrZ feed_data)rfddatar#rrrpipe_data_received@s     z+SubprocessStreamProtocol.pipe_data_receivedcCs|dkr<|j}|dk r+|j|j|dS|dkrT|j}n|dkrl|j}nd}|dkr|dkr|jn |j|||jkr|jj||j dS)Nrrr!) rcloseZconnection_lostrrZfeed_eofZ set_exceptionrremove_maybe_close_transport)rr*excpiper#rrrpipe_connection_lostJs$             z-SubprocessStreamProtocol.pipe_connection_lostcCsd|_|jdS)NT)rr/)rrrrprocess_exitedas z'SubprocessStreamProtocol.process_exitedcCs8t|jdkr4|jr4|jjd|_dS)Nr)lenrrrr-)rrrrr/es z/SubprocessStreamProtocol._maybe_close_transport) r __module__ __qualname____doc__rr r)r,r2r3r/rr)rrr s    r c@seZdZddZddZeddZeddZd d Z d d Z d dZ eddZ eddZ eddZedddZdS)ProcesscCsR||_||_||_|j|_|j|_|j|_|j|_dS)N)rZ _protocolr&rrrZget_pidpid)rr(r"r rrrrls      zProcess.__init__cCsd|jj|jfS)Nz<%s %s>)rrr9)rrrrr uszProcess.__repr__cCs |jjS)N)rZget_returncode)rrrr returncodexszProcess.returncodeccs|jjEdHS)zdWait until the process exit and return the process return code. This method is a coroutine.N)rZ_wait)rrrrwait|sz Process.waitcCs|jj|dS)N)r send_signal)rsignalrrrr<szProcess.send_signalcCs|jjdS)N)r terminate)rrrrr>szProcess.terminatecCs|jjdS)N)rkill)rrrrr?sz Process.killccs|jj}|jj||r>tjd|t|y|jjEdHWnDtt fk r}z|rtjd||WYdd}~XnX|rtjd||jj dS)Nz%%r communicate: feed stdin (%s bytes)z%r communicate: stdin got %rz%r communicate: close stdin) r& get_debugrwriter debugr4ZdrainBrokenPipeErrorConnectionResetErrorr-)rinputrBr0rrr _feed_stdins &zProcess._feed_stdincCsdS)Nr)rrrr_noopsz Process._noopccs|jj|}|dkr*|j}n|dks<t|j}|jjr|dkrfdnd}tjd|||j EdH}|jjr|dkrdnd}tjd|||j |S)Nr!rrrz%r communicate: read %sz%r communicate: close %s) rr$rAssertionErrorrr&r@r rBreadr-)rr*r(streamnameoutputrrr _read_streams    zProcess._read_streamNccs|dk r|j|}n |j}|jdk rK|jd}n |j}|jdk rx|jd}n |j}tj|||d|jEdH\}}}|jEdH||fS)Nrr!r ) rFrGrrMrrZgatherr&r;)rrErrrrrr communicates    zProcess.communicate)rr5r6rr propertyr:r r;r<r>r?rFrGrMrNrrrrr8ks     r8c +sodkrtjfdd}j||d|d|d||EdH\}} t|| S)NcstddS)Nrr )r r)rr rrs z)create_subprocess_shell..rrr)rget_event_loopZsubprocess_shellr8) cmdrrrr rkwdsprotocol_factoryr(r"r)rr rrs  rrrr rc /srdkrtjfdd}j|||d|d|d||EdH\} } t| | S)NcstddS)Nrr )r r)rr rrrPs z(create_subprocess_exec..rrr)rrQZsubprocess_execr8) Zprogramrrrr rargsrSrTr(r"r)rr rrs    )__all__ subprocessrrrrZ coroutinesr logr PIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr r8Z_DEFAULT_LIMITrrrrrrs(      X]