U kg@sdZddlZddlZddlmZddlmZddlmZddlmZddlm Z ej Z ej Z ej Z Gd d d ej ejZGd d d Zddddejfd dZddddejdddZdS))create_subprocess_execcreate_subprocess_shellN)events) protocols)streams)tasks)loggercsXeZdZdZfddZddZddZdd Zd d Zd d Z ddZ ddZ Z S)SubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.csHtj|d||_d|_|_|_d|_d|_g|_|j |_ dS)NloopF) super__init___limitstdinstdoutstderr _transport_process_exited _pipe_fds_loopZ create_future _stdin_closed)selflimitr  __class__(/usr/lib/python3.8/asyncio/subprocess.pyrsz!SubprocessStreamProtocol.__init__cCsn|jjg}|jdk r&|d|j|jdk rB|d|j|jdk r^|d|jdd|S)Nzstdin=zstdout=zstderr=z<{}> )r__name__rappendrrformatjoin)rinforrr__repr__s    z!SubprocessStreamProtocol.__repr__cCs||_|d}|dk rDtj|j|jd|_|j||j d|d}|dk rtj|j|jd|_ |j ||j d|d}|dk rtj ||d|jd|_ dS)Nrrr r)protocolreaderr ) rget_pipe_transportr StreamReaderrrrZ set_transportrr r StreamWriterr)r transportZstdout_transportZstderr_transportZstdin_transportrrrconnection_made)s,       z(SubprocessStreamProtocol.connection_madecCs:|dkr|j}n|dkr |j}nd}|dk r6||dS)Nrr&)rrZ feed_data)rfddatar(rrrpipe_data_receivedAsz+SubprocessStreamProtocol.pipe_data_receivedcCs|dkrN|j}|dk r||||dkr>|jdn |j|dS|dkr^|j}n|dkrn|j}nd}|dk r|dkr|n ||||j kr|j || dS)Nrrr&) rcloseZconnection_lostrZ set_resultZ set_exceptionrrZfeed_eofrremove_maybe_close_transport)rr.excpiper(rrrpipe_connection_lostKs*      z-SubprocessStreamProtocol.pipe_connection_lostcCsd|_|dS)NT)rr3rrrrprocess_exitedfsz'SubprocessStreamProtocol.process_exitedcCs(t|jdkr$|jr$|jd|_dS)Nr)lenrrrr1r7rrrr3js z/SubprocessStreamProtocol._maybe_close_transportcCs||jkr|jSdSN)rr)rstreamrrr_get_close_waiteros z*SubprocessStreamProtocol._get_close_waiter) r __module__ __qualname____doc__rr$r-r0r6r8r3r< __classcell__rrrrr s   r c@sjeZdZddZddZeddZddZd d Zd d Z d dZ ddZ ddZ ddZ dddZdS)ProcesscCs8||_||_||_|j|_|j|_|j|_||_dSr:)rZ _protocolrrrrZget_pidpid)rr,r'r rrrruszProcess.__init__cCsd|jjd|jdS)N)rrrBr7rrrr$~szProcess.__repr__cCs |jSr:)rZget_returncoder7rrr returncodeszProcess.returncodecs|jIdHS)z?Wait until the process exit and return the process return code.N)rZ_waitr7rrrwaitsz Process.waitcCs|j|dSr:)r send_signal)rsignalrrrrGszProcess.send_signalcCs|jdSr:)r terminater7rrrrIszProcess.terminatecCs|jdSr:)rkillr7rrrrJsz Process.killc s|j}|j||r,td|t|z|jIdHWn8tt fk rx}z|rhtd||W5d}~XYnX|rtd||j dS)Nz%%r communicate: feed stdin (%s bytes)z%r communicate: stdin got %rz%r communicate: close stdin) r get_debugrwriter debugr9ZdrainBrokenPipeErrorConnectionResetErrorr1)rinputrMr4rrr _feed_stdins     zProcess._feed_stdincsdSr:rr7rrr_noopsz Process._noopcs|j|}|dkr|j}n|dks(t|j}|jrV|dkrDdnd}td||| IdH}|jr|dkrzdnd}td||| |S)Nr&rrrz%r communicate: read %sz%r communicate: close %s) rr)rAssertionErrorrrrKr rMreadr1)rr.r,r;nameoutputrrr _read_streams    zProcess._read_streamNcs|dk r||}n|}|jdk r2|d}n|}|jdk rP|d}n|}tj||||jdIdH\}}}|IdH||fS)Nrr&r ) rQrRrrWrrZgatherrrF)rrPrrrrrr communicates      zProcess.communicate)N)rr=r>rr$propertyrErFrGrIrJrQrRrWrXrrrrrAts  rAc sbdkrtntjdtddfdd}j||f|||d|IdH\}} t|| S)NZThe loop argument is deprecated since Python 3.8 and scheduled for removal in Python 3.10.r& stacklevelcs tdSNr%r rr%rrsz)create_subprocess_shell..rrr)rget_event_loopwarningswarnDeprecationWarningZsubprocess_shellrA) cmdrrrr rkwdsprotocol_factoryr,r'rr%rrs$ r)rrrr rc sfdkrtntjdtddfdd}j||f||||d|IdH\} } t| | S)NrZr&r[cs tdSr]r^rr%rrr_sz(create_subprocess_exec..r`)rrarbrcrdZsubprocess_execrA) Zprogramrrrr rargsrfrgr,r'rr%rrs( r)__all__ subprocessrbrrrrlogr PIPEZSTDOUTZDEVNULLZFlowControlMixinZSubprocessProtocolr rAZ_DEFAULT_LIMITrrrrrrs.     bV