B
    dC                 @   s   d dl mZmZmZ d dlZd dlZd dlZd dlZd dlZd dl	m
Z
 dd Zdd ZG dd	 d	eZG d
d deZG dd deZeZdddZdd ZdddZedkre  dS )    )absolute_importdivisionprint_functionN)rangec             C   s0   |d krt j}x| D ]}t|| |d qW d S )N)file)sysstdoutprint)linesoutprefixline r   n/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/easy_run.py_show_lines   s     
r   c              C   s:   ddg} x,| D ]$}t j|}|dk	rd||f S qW dS )zz
  Convenience function for returning either DYLD_LIBRARY_PATH or
  DYLD_FALLBACK_LIBRARY_PATH (for conda environments)
  DYLD_LIBRARY_PATHDYLD_FALLBACK_LIBRARY_PATHNz%s="%s"zDYLD_LIBRARY_PATH= )osenvironget)Zdyld_optionsZdyldZ	dyld_pathr   r   r   
macos_dyld   s    
r   c               @   sN   e Zd Zdd ZefddZdefddZefdd	ZdddZdddZ	d
S )fully_buffered_basec             C   sr   | j r
tt| jdkrZdg}|dt| j  x| jD ]}|d|  q:W d|S | jdkrnd| j S d S )Nr   zchild process stderr output:z  command: z  
znon-zero return code: %s)	join_stdout_stderrAssertionErrorlenstderr_linesappendreprcommandjoinreturn_code)selfmsgr   r   r   r   format_errors_if_any   s    



z(fully_buffered_base.format_errors_if_anyc             C   s&   | j r
t|  }|d k	r"||| S )N)r   r   r$   )r"   Errorr#   r   r   r   raise_if_errors*   s
    
z#fully_buffered_base.raise_if_errors
   c                s    fdd} j d k	rNt j dkr| }|dt j   |d|nt jdkr| }x$ jd | D ]}|d|  qrW t j}||kr||d krxB j|| D ]}|d|  qW n|d |d	||   |d| S )
Nc                 s   dg} |  dt j  | S )Nz unexpected child process output:z  command: )r   r   r   )result)r"   r   r   	start_msg2   s    z6fully_buffered_base.raise_if_output.<locals>.start_msgr   z  length of output: %d bytesr   z     z  ...z  remaining %d lines omitted.)stdout_bufferr   r   r    stdout_lines)r"   Zshow_output_thresholdr%   r)   r#   r   nr   )r"   r   raise_if_output1   s(    


z#fully_buffered_base.raise_if_outputc             C   s   | j |d | j|d | S )N)r%   )r&   r.   )r"   r%   r   r   r   raise_if_errors_or_outputK   s    z-fully_buffered_base.raise_if_errors_or_outputN c             C   s   t | j||d d S )N)r
   r   r   )r   r   )r"   r   r   r   r   r   show_stderrP   s    zfully_buffered_base.show_stderrc             C   s"   | j d k	stt| j ||d d S )N)r
   r   r   )r,   r   r   )r"   r   r   r   r   r   show_stdoutS   s    zfully_buffered_base.show_stdout)Nr0   )Nr0   )
__name__
__module____qualname__r$   RuntimeErrorr&   r.   r/   r1   r2   r   r   r   r   r      s   
r   c               @   s   e Zd ZdZdddZdS )	fully_buffered_simplea[  Executes command, sends stdin_lines (str or sequence), then reads
stdout_lines first, stderr_lines second (if join_stdout_stderr
is False).

The constructor may deadlock if the I/O buffers are too small to allow
the blocking write and reads in the given sequence. Specifically,
stdin_lines may be too big, or there may be too many stderr_lines,
but there can be any number of stdout_lines. The tests below are
known to work under Mac OS X, Windows XP, IRIX, and Tru64 Unix with
stdin_lines up to 1000000, stderr_lines up to 500. I.e. this simple
implementation should cover most practical situations.
  NFTc       	      C   s   || _ || _|r(t|d|\}}d }nt|d|\}}}|d k	rvt|tsld|}t|dkrl|d7 }|	| |
  |rd | _|  | _n| | _d | _|d k	r|  | _ng | _|
  |d k	r|
  d | _d S )Ntr   r   )r   r   r   popen4popen3
isinstancestrr    r   writecloser+   read
splitlinesr,   r   r!   )	r"   r   stdin_linesr   stdout_splitlinesbufsizeZchild_stdinZchild_stdoutZchild_stderrr   r   r   __init__f   s2    



zfully_buffered_simple.__init__)NFTr8   )r3   r4   r5   __doc__rE   r   r   r   r   r7   W   s
      r7   c               @   s   e Zd ZdZdddZdS )	fully_buffered_subprocessz/This implementation is supposed to never block.NFTr8   c             C   s  dd }|| _ || _t|ts(t|}tjdkr@dt  | }|d k	rpt|tspd	|}t
|dkrp|d7 }|r|tj}ntj}tj|d|tjtj|dtjdktjdkrtjnd d		}	|d k	rJtjdkr8d d g}
tj||	||
fd
}|  |	| | r$tt|	jtj |	  |
d |
d  }}n|	j|d\}}n|	j|d\}}|rrd | _| | _n|| _d | _|rg | _n
| | _|	j| _d S )Nc             S   s$   | j |d\}}||d< ||d< d S )N)inputr      )communicate)processr
   r(   oer   r   r   target   s    z2fully_buffered_subprocess.__init__.<locals>.targetdarwinz%s exec r   r   Twin32)	argsshellrD   stdinr   stderruniversal_newlines	close_fds
preexec_fn)rN   rQ   rI   )rH   ) r   r   r<   r=   
subprocesslist2cmdliner   platformr   r    r   STDOUTPIPEPopenr   setsid	threadingThreadstartis_alivekillpggetpgidpidsignalSIGTERMrJ   r+   rA   r,   r   
returncoder!   )r"   r   timeoutrB   r   rC   rD   rN   rT   prthreadrL   rM   r   r   r   rE      s\    








z"fully_buffered_subprocess.__init__)NNFTr8   )r3   r4   r5   rF   rE   r   r   r   r   rG      s       rG   Tc             C   s   t | ||dS )N)r   rB   r   )fully_buffered)r   rB   r   r   r   r   go   s    rn   c             C   sV   x.t jt jgD ]}t|dd}|dk	r|  qW t jdkrHdt  |  } tj| ddS )a  
  Wraps subprocess.call to run a command.

  Parameters
  ----------
  command : str

  Returns
  -------
  int
      Exit code of subprocess.

  Examples
  --------
  >>> from libtbx.easy_run import call
  >>> ret = call("echo 1")
  1
  >>> print ret
  0
  flushNrO   z%s exec T)rQ   rR   )r   r   rT   getattrrZ   r   rX   call)r   sro   r   r   r   rq      s     

rq   c             C   s4  ddl m} | d kr"tjdd  } d| k}d| kr8t}nt}xVdD ]N}xH||d ||dd	t|dgD ]"}|r|t|j	 |j	d
gksjt
qjW qBW tjdrx6dD ].}||d }|rt|j	 d|j	kst
qW tjdr xdD ]}||d }|rt|j	 dd |j	D dgks,t
||dgd }|rNt|j	 dd |j	D dgksjt
||ddgd }|rt|j	 dd |j	D dgkst
||dd }|rt|j	 dd |j	D dgkst
qW tjdkr|dd }|rt|j	 t|j	dks&t
tjdd }|d k	r|d dk r|d!| d }|rpt|j	 t|j	dkst
tj}|d"dkst
d"| d" }tjdkrd#| }d$tjkrttd%sd&tjd$< ntjd$= tjdkr|d'd }n"tjd(r$|d(d }nd }|d k	rn|rBt|j	 x*|j	D ] }|d$rJ|d)ksJt
qJW x*d*D ] }	|d+| |	d,}t|jdkr|rt|j |jd d-tj d  st
|	r|jd kst
|j	g kst
n |jd&kst
|j	d kst
n||r*t|j	 |	rf|jd ks@t
|j	d d-tj d  st
n0|jd-tj d  st
|j	d ksvt
qvW td+| d}|rt|j	 |j	d d-tj d  st
|d.| d }|r t|j	 |j	d/gkst
|d0  }}||d }|r<t|j	 |j	dgksNt
||dgd }|rpt|j	 |j	dgkst
||ddgd }|rt|j	 |j	dgkst
||dd }|rt|j	 |j	dgkst
d1| krd2}
nd3}
|tkrd4}nd2}||d5d t|
D d }|r@t|j	 |j	t|
gksVt
|d6 }||d7d }| }|j|d8d9 |rtj |!  |! d:kst
|d;  }}||dd }| }|j"|d<d9 |rtj |!  |! d=kst
||d>d t|
D d }t#t$t%|j	|_	|rVt|j	d d? |j	d@d   t|j	|
ksjt
|j	d d? dddddAgkst
|j	d@d  dBd t|
d? |
D kst
|d6 }||dCd t|ddDD d}t|j	dkst
t#t$t%|j|_|r(t|jd d? |jd@d   t|j|ks<t
|jd d? dEd t||d? dDD ksjt
|jd@d  dFdAdddgkst
|dG&dH|t'dIf (  }||dJd t|
D d}t#t$t%|j	|_	t#t$t%|j|_|	rt|j	d d? |j	d@d   |	r0t|jd d? |jd@d   t|j	|
k	sDt
|j	d d? dddddAgk	sft
|j	d@d  dKd t|
d? |
D k	st
t|j|k	st
|jd d? dLd t|d |dM dDD k	st
|jd@d  dAddddgk	st
t|dNd t|
D d}t#t$t%|j	|_	|
rJt|j	d d? |j	d@d   t|j	|
| k
sbt
|j	d d? dddddAgk
st
|j	d@d  dAddddgk
st
y|dOd  W n2 t)k

r } z|
rt| W d d }~X Y nX t*xd*D ]}	xdPD ]\}}y$||dQd t|D |	dR  W n t)k
r } z|rNt| t|dSsbt
|	r|dTkrt|+t|d st
nt|+dUst
nt|+dV| st
W d d }~X Y nX t*q W 
qW ||d,  |dWdXgd}|rt|j	 t|j xdY| kr&qW tdZ d S )[Nr   )	cStringIOrI   z	--verbosez--simple)zecho hello world)echohelloworld)r   T)r   r   zhello worldz/bin/ls)z/bin/ls /bin)z/bin/lsz/binlsz/usr/bin/wc)z/usr/bin/wc -l)z/usr/bin/wcz-lc             S   s   g | ]}|  qS r   )strip).0rr   r   r   r   
<listcomp>  s    zexercise.<locals>.<listcomp>0ru   )r   rB   c             S   s   g | ]}|  qS r   )rx   )ry   rr   r   r   r   rz     s    1rv   c             S   s   g | ]}|  qS r   )rx   )ry   rr   r   r   r   rz     s    2zhello
world
bye
c             S   s   g | ]}|  qS r   )rx   )ry   rr   r   r   r   rz     s    3ntdirwindir zdir "zcall 
PYTHONPATHunsetenvr0   setz/usr/bin/printenvzPYTHONPATH=)TFz%s -V)r   rC   zPython z%s -c "print(3+4)"7zO -c "import sys; print(len(list(filter(bool, sys.stdin.read().splitlines()))))"z--quicki'  i@B i  c             S   s   g | ]}t |qS r   )r=   )ry   ir   r   r   rz   v  s    z4 -c "import sys; sys.stderr.write(sys.stdin.read())"zHello
World
Bye
z%()r   r   z%(Hello
%(World
%(Bye
z4 -c "import sys; sys.stdout.write(sys.stdin.read())"z>:z>:hello
>:world
>:bye
c             S   s   g | ]}t |qS r   )r=   )ry   r   r   r   r   rz     s       4c             S   s   g | ]}t |qS r   )r=   )ry   rr   r   r   r   rz     s   c             S   s   g | ]}t |qS r   )r=   )ry   r   r   r   r   rz     s    r8   c             S   s   g | ]}t |qS r   )r=   )ry   rr   r   r   r   rz     s   5z; z -c "import sys, os
lines = sys.stdin.read()
sys.stdout.write(lines)
sys.stdout.flush()
lines = list(filter(bool, lines.splitlines()))[:%d]
lines.reverse()
nl = chr(%d)
sys.stderr.write(nl.join(lines)+nl)
sys.stderr.flush()"r   c             S   s   g | ]}t |qS r   )r=   )ry   r   r   r   r   rz     s    c             S   s   g | ]}t |qS r   )r=   )ry   rr   r   r   r   rz     s   c             S   s   g | ]}t |qS r   )r=   )ry   rr   r   r   r   rz     s      c             S   s   g | ]}t |qS r   )r=   )ry   r   r   r   r   rz     s    ZC68649356116218352))r'      )      )      )      c             S   s   g | ]}t |qS r   )r=   )ry   r   r   r   r   rz     s    )r   rB   rC   z!unexpected child process output:
r   z  remaining 3 lines omitted.z  length of output: %d bytesZnslookup	localhostz	--foreverOK)-	six.movesrs   r   argvr7   rm   r&   rn   r	   r,   r   r   pathisfilenamer   r   r   find
executablecounthasattr
startswithr   versionsplitr+   r   r=   r.   r1   r   r>   getvaluer2   listfilterboolr    ordrA   r6   Exception_expectedendswithr/   )rQ   StringIOverboseZfbr   r(   r   Zpyexer   rC   Z	n_lines_oZ	n_lines_err   Zcat_commandrM   r-   br   r   r   exercise   s    

 

 
 
 
 
 
 
 

 
  

 

 
$ 

 
 
 
 


 
 
  " "	  " " ""  
 
*

 r   __main__)NT)N)
__future__r   r   r   r   rX   r   r_   rf   r   r   r   r   objectr   r7   rG   rm   rn   rq   r   r3   r   r   r   r   <module>   s$   ;2F

 {