a
    i3e7                     @   s   d dgZ ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
l	m
Z
 ddlmZ ejZejZejZG dd dejejZG dd dZe
ddddejfddZe
ddddejddd ZdS )create_subprocess_execcreate_subprocess_shell    N   )events)futures)	protocols)streams)tasks)	coroutine)loggerc                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )SubprocessStreamProtocolz0Like StreamReaderProtocol, but for a subprocess.c                    s0   t  j|d || _d  | _ | _| _d | _d S )Nloop)super__init___limitstdinstdoutstderr
_transport)selflimitr   	__class__ E/home/pi/bot/my_env/lib/python3.9/site-packages/asyncio/subprocess.pyr      s    z!SubprocessStreamProtocol.__init__c                 C   sf   | j jg}| jd ur$|d| j  | jd ur>|d| j  | jd urX|d| j  dd| S )Nzstdin=%rz	stdout=%rz	stderr=%rz<%s> )r   __name__r   appendr   r   join)r   infor   r   r   __repr__   s    



z!SubprocessStreamProtocol.__repr__c                 C   s   || _ |d}|d ur8tj| j| jd| _| j| |d}|d urjtj| j| jd| _| j| |d}|d urtj	|| d | jd| _
d S )Nr   r   r      r   )protocolreaderr   )r   get_pipe_transportr   StreamReaderr   _loopr   Zset_transportr   StreamWriterr   )r   	transportZstdout_transportZstderr_transportZstdin_transportr   r   r   connection_made(   s(    


z(SubprocessStreamProtocol.connection_madec                 C   s:   |dkr| j }n|dkr | j}nd }|d ur6|| d S )Nr   r#   )r   r   Z	feed_data)r   fddatar%   r   r   r   pipe_data_received>   s    z+SubprocessStreamProtocol.pipe_data_receivedc                 C   sx   |dkr,| j }|d ur|  | | d S |dkr<| j}n|dkrL| j}nd }|d krt|d u rj|  n
|| d S )Nr   r   r#   )r   closeZconnection_lostr   r   Zfeed_eofZset_exception)r   r,   excpiper%   r   r   r   pipe_connection_lostH   s    

z-SubprocessStreamProtocol.pipe_connection_lostc                 C   s   | j   d | _ d S N)r   r/   r   r   r   r   process_exited[   s    
z'SubprocessStreamProtocol.process_exited)r   
__module____qualname____doc__r   r!   r+   r.   r2   r5   __classcell__r   r   r   r   r      s   

r   c                   @   s~   e Zd Zdd Zdd Zedd Zedd Zd	d
 Z	dd Z
dd Zedd Zedd Zedd ZedddZdS )Processc                 C   s8   || _ || _|| _|j| _|j| _|j| _| | _d S r3   )r   	_protocolr(   r   r   r   Zget_pidpid)r   r*   r$   r   r   r   r   r   a   s    zProcess.__init__c                 C   s   d| j j| jf S )Nz<%s %s>)r   r   r<   r4   r   r   r   r!   j   s    zProcess.__repr__c                 C   s
   | j  S r3   )r   Zget_returncoder4   r   r   r   
returncodem   s    zProcess.returncodec                 c   s   | j  E dH S )zdWait until the process exit and return the process return code.

        This method is a coroutine.N)r   _waitr4   r   r   r   waitq   s    zProcess.waitc                 C   s   | j | d S r3   )r   send_signal)r   signalr   r   r   r@   x   s    zProcess.send_signalc                 C   s   | j   d S r3   )r   	terminater4   r   r   r   rB   {   s    zProcess.terminatec                 C   s   | j   d S r3   )r   killr4   r   r   r   rC   ~   s    zProcess.killc              
   c   s   | j  }| j| |r,td| t| z| j E d H  W n: tt	fyz } z|rftd| | W Y d }~n
d }~0 0 |rtd|  | j
  d S )Nz%%r communicate: feed stdin (%s bytes)z%r communicate: stdin got %rz%r communicate: close stdin)r(   	get_debugr   writer   debuglenZdrainBrokenPipeErrorConnectionResetErrorr/   )r   inputrF   r0   r   r   r   _feed_stdin   s    
$zProcess._feed_stdinc                 C   s   d S r3   r   r4   r   r   r   _noop   s    zProcess._noopc                 c   s   | j |}|dkr| j}n|dks(J | j}| j rV|dkrDdnd}td| | | E d H }| j r|dkrzdnd}td| | |	  |S )Nr#   r   r   r   z%r communicate: read %sz%r communicate: close %s)
r   r&   r   r   r(   rD   r   rF   readr/   )r   r,   r*   streamnameoutputr   r   r   _read_stream   s    

zProcess._read_streamNc                 c   s   |r|  |}n|  }| jd ur.| d}n|  }| jd urL| d}n|  }tj|||| jdE d H \}}}|  E d H  ||fS )Nr   r#   r   )	rK   rL   r   rQ   r   r	   Zgatherr(   r?   )r   rJ   r   r   r   r   r   r   communicate   s    


zProcess.communicate)N)r   r6   r7   r   r!   propertyr=   r
   r?   r@   rB   rC   rK   rL   rQ   rR   r   r   r   r   r:   `   s"   	




r:   c           
      +   sP   d u rt   fdd}j|| f|||d|E d H \}}	t||	S )Nc                      s   t  dS Nr"   r   r   r"   r   r   <lambda>   s   z)create_subprocess_shell.<locals>.<lambda>r   r   r   )r   get_event_loopZsubprocess_shellr:   )
cmdr   r   r   r   r   kwdsprotocol_factoryr*   r$   r   r"   r   r      s    )r   r   r   r   r   c                /   sV   d u rt   fdd}j|| g|R |||d|E d H \}	}
t|	|
S )Nc                      s   t  dS rT   rU   r   r"   r   r   rV      s   z(create_subprocess_exec.<locals>.<lambda>rW   )r   rX   Zsubprocess_execr:   )programr   r   r   r   r   argsrZ   r[   r*   r$   r   r"   r   r      s    )__all__collections
subprocess r   r   r   r   r	   Z
coroutinesr
   logr   PIPESTDOUTDEVNULLZFlowControlMixinZSubprocessProtocolr   r:   Z_DEFAULT_LIMITr   r   r   r   r   r   <module>   s2   L]