3
d                 @   s   d Z ddlZddl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l
mZmZmZ ddlmZmZ ddlmZ ejd	ZG d
d deZdddZdS )z Miscellaneous utility functions
    N)Path)PopenSTDOUTPIPE   )canonicalize_envread_stream   )loggingznipype.interfacec               @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )StreamzFunction to capture stdout and stderr streams with timestamps

    stackoverflow.com/questions/4984549/merge-and-sync-stdout-and-stderr/5188359
    c             C   s4   || _ || _d| _g | _d| _tj d p,d| _d S )N r   r   zUTF-8)_name_impl_buf_rows_lastidxlocalegetdefaultlocaledefault_encoding)selfnameimpl r   9/tmp/pip-build-7vycvbft/nipype/nipype/utils/subprocess.py__init__   s    zStream.__init__c             C   s
   | j j S )z!Pass-through for file descriptor.)r   fileno)r   r   r   r   r   $   s    zStream.filenor   c             C   s   x| j |dk	r|sP qW dS )z>Read from the file descriptor. If 'drain' set, read until EOF.N)_read)r   drainr   r   r   read(   s    zStream.readc                s   j  }tj|djj}| r.j r.dS d|krL|sL j|7  _g S j| }d|krp|jdd\}}n|}d}|_tjj j	  |j
d} j fdd|D 7  _x.tjtjD ]}tjj| d  qW tj_dS )zRead from the file descriptori   N
r   c                s"   g | ]} d j  |f |fqS )z%s %s:%s)r   ).0r)nowr   r   r   
<listcomp>C   s    z Stream._read.<locals>.<listcomp>)r   osr   decoder   r   rsplitdatetimer"   	isoformatsplitr   ranger   lenifloggerinfo)r   r   fdbuftmprestrowsidxr   )r"   r   r   r   .   s(    

zStream._readN)r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r      s
   
r   {Gz?Fc                sN  | j }t| j}d}d}t}t}	|dkrHtjj| jd}t|d}t	}	n|dkrtjj| jd}t|d}tjj| jd}t|d}	nF|dkrtjj| jd}t|d}n"|d	krtjj| jd}t|d}	|rt
| jd
 j| t|||	d| j|tjjd d}
g g g d}|dkrtd|
jtd|
jg d fdd	}x |
jdkrd|
j  |  qFW |dd i }g }x0 D ](}|j}||7 }dd |D ||j< q~W |j  dd |D |d< |jdr|
j  |dk	r"|j  |j  t|d}|j }W dQ R X t|td|d< ~|dk	rl|	j  |	j  t|d}|j }W dQ R X t|td|d< ~|dkr|d |d< g |d< n6|
j \}}	|dkrt|td|d< t|	td|d< |
j| _y|
j  W n4 t k
r
 } z|j!t!j"kr W Y dd}~X nX ~
~~	t#j$  dj|d | _dj|d | _dj|d | _%| S ) zRun a command, read stdout and stderr, prefix with timestamp.

    The returned runtime contains a merged stdout+stderr log with timestamps
    Nfilezoutput.nipypewbZ
file_splitzstdout.nipypezstderr.nipypeZfile_stdoutZfile_stderrzcommand.txtTwin)stdoutstderrshellcwdenv	close_fds)r<   r=   mergedstreamr<   r=   r   c                sv   yt j  g g }W n@ t jk
rT } z"tj| |jtjkrBd S  W Y d d }~X nX x|d D ]}|j|  q`W d S )Nr   )selecterrorr,   r-   errnoZEINTRr   )r   reserC   )streamstimeoutr   r   _process~   s    
zrun_command.<locals>._processr   )r   c             S   s   g | ]}|d  qS )r	   r   )r    r!   r   r   r   r#      s    zrun_command.<locals>.<listcomp>c             S   s   g | ]}|d  qS )r   r   )r    r!   r   r   r   r#      s    rB   rb)loggerZ	allatoncer   )r   )&cmdliner   environr   r$   pathjoinr?   openr   r   Z
write_textr   sysplatform
startswithr   r<   r=   
returncodepollr   r   sortwaitflushcloser   r   r,   communicate	terminateOSErrorrF   ZESRCHgcZcollectrB   )ZruntimeoutputrJ   Zwrite_cmdlinerN   r@   Zerrfileoutfiler<   r=   procresultrK   temprC   r2   ZofhZ	stdoutstrZefhZ	stderrstrrE   r   )rI   rJ   r   run_commandI   s    











re   )Nr8   F)r7   r$   rS   r_   rF   rD   r   r'   Zpathlibr   
subprocessr   r   r   Z	filemanipr   r   r   r
   	getLoggerr,   objectr   re   r   r   r   r   <module>   s   
3