î j fã @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)ÚloggercsdeZdZdZ‡fdd†Zdd„Zdd„Zdd „Zd d „Zd d „Z ‡S)ÚSubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.cs@tƒjd|ƒ||_d|_|_|_d|_dS)NÚloop)ÚsuperÚ__init__Ú_limitÚstdinÚstdoutÚstderrÚ _transport)ÚselfÚlimitr )Ú __class__©ú7/opt/alt/python34/lib64/python3.4/asyncio/subprocess.pyrs z!SubprocessStreamProtocol.__init__cCs’|jjg}|jdk r5|jd|jƒn|jdk r[|jd|jƒn|jdk r�|jd|jƒnddj|ƒS)Nzstdin=%rz stdout=%rz stderr=%rz<%s>ú )rÚ__name__rÚappendrrÚjoin)rÚinforrrÚ__repr__sz!SubprocessStreamProtocol.__repr__cCsð||_|jdƒ}|dk rXtjd|jd|jƒ|_|jj|ƒn|jdƒ}|dk r§tjd|jd|jƒ|_|jj|ƒn|jdƒ}|dk rìtj |d|ddd|jƒ|_ ndS)Nrrr érÚprotocolÚreader) rÚget_pipe_transportrÚ StreamReaderrÚ_looprZ set_transportrÚ StreamWriterr)rÚ transportZstdout_transportZstderr_transportZstdin_transportrrrÚconnection_made&s"     z(SubprocessStreamProtocol.connection_madecCsV|dkr|j}n|dkr0|j}nd}|dk rR|j|ƒndS)Nrr)rrZ feed_data)rÚfdÚdatar!rrrÚpipe_data_received<s     z+SubprocessStreamProtocol.pipe_data_receivedcCs®|dkr?|j}|dk r.|jƒn|j|ƒdS|dkrW|j}n|dkro|j}nd}|dkrª|dkrš|jƒqª|j|ƒndS)Nrrr)rÚcloseZconnection_lostrrZfeed_eofZ set_exception)rr(ÚexcÚpiper!rrrÚpipe_connection_lostFs            z-SubprocessStreamProtocol.pipe_connection_lostcCs|jjƒd|_dS)N)rr+)rrrrÚprocess_exitedYs z'SubprocessStreamProtocol.process_exited) rÚ __module__Ú __qualname__Ú__doc__rrr'r*r.r/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 rrrr_s      zProcess.__init__cCsd|jj|jfS)Nz<%s %s>)rrr4)rrrrrhszProcess.__repr__cCs |jjƒS)N)rZget_returncode)rrrrÚ returncodekszProcess.returncodeccs|jjƒDdHS)zdWait until the process exit and return the process return code. This method is a coroutine.N)rZ_wait)rrrrÚwaitosz Process.waitcCs|jj|ƒdS)N)rÚ send_signal)rÚsignalrrrr7vszProcess.send_signalcCs|jjƒdS)N)rÚ terminate)rrrrr9yszProcess.terminatecCs|jjƒdS)N)rÚkill)rrrrr:|sz Process.killccsË|jjƒ}|jj|ƒ|rAtjd|t|ƒƒny|jjƒDdHWnGtt fk r }z!|rŽtjd||ƒnWYdd}~XnX|rºtjd|ƒn|jj ƒdS)Nz%%r communicate: feed stdin (%s bytes)z%r communicate: stdin got %rz%r communicate: close stdin) r$Ú get_debugrÚwriter ÚdebugÚlenZdrainÚBrokenPipeErrorÚConnectionResetErrorr+)rÚinputr=r,rrrÚ _feed_stdins )zProcess._feed_stdincCsdS)Nr)rrrrÚ_noop‘sz Process._noopccsÌ|jj|ƒ}|dkr*|j}n |j}|jjƒrp|dkrTdnd}tjd||ƒn|jƒDdH}|jjƒr¾|dkr¢dnd}tjd||ƒn|j ƒ|S)Nrrrrz%r communicate: read %sz%r communicate: close %s) rr"rrr$r;r r=Úreadr+)rr(r&ÚstreamÚnameÚoutputrrrÚ _read_stream•s    zProcess._read_streamNccsÃ|r|j|ƒ}n |jƒ}|jdk rE|jdƒ}n |jƒ}|jdk rr|jdƒ}n |jƒ}tj|||d|jƒDdH\}}}|jƒDdH||fS)Nrrr ) rBrCrrHrrZgatherr$r6)rrArrrrrrÚ communicate§s   zProcess.communicate)rr0r1rrÚpropertyr5r r6r7r9r:rBrCrHrIrrrrr3^s     r3c +srˆdkrtjƒ‰n‡‡fdd†}ˆj||d|d|d||�DdH\}} t|| ˆƒS)NcstdˆdˆƒS)Nrr )r r)rr rrÚÀs z)create_subprocess_shell..rrr)rÚget_event_loopZsubprocess_shellr3) Úcmdrrrr rÚkwdsÚprotocol_factoryr&r r)rr rr»s rrrr rc /suˆdkrtjƒ‰n‡‡fdd†}ˆj||d|d|d|||ŽDdH\} } t| | ˆƒS)NcstdˆdˆƒS)Nrr )r r)rr rrrKÎs z(create_subprocess_exec..rrr)rrLZsubprocess_execr3) Zprogramrrrr rÚargsrNrOr&r r)rr rrÈs  )Ú__all__Ú subprocessÚrrrrZ coroutinesr Úlogr ÚPIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr r3Z_DEFAULT_LIMITrrrrrrÚs(      K]