ó
(LD]c           @  sA  d  Z  d d l m Z d Z d d d d d g Z d d	 l m Z d d
 l Z d d
 l Z d d l	 m	 Z	 m
 Z
 m Z d d
 l Z d d
 l Z y d d l m Z Wn! e k
 rÄ d d l m Z n Xd d
 l Z d d
 l Z d d
 l Z d d
 l Z d d
 l Z e j d
 ƒ Z y. e j j e d ƒ Z e j j e d ƒ Z Wn; e k
 r{e j j e d ƒ Z e j j e d ƒ Z n Xd Z d Z e  e j! d d
 ƒ p d Z" e" j# ƒ  d k r¾d Z" n  d d „ Z$ d e% f d „  ƒ  YZ& e e e e" d „ ƒ Z' e" d „ Z( d
 a) e j* ƒ  Z+ e" d „ Z, d „  Z- d „  Z. d „  Z/ d
 S(   sh   Capture C-level FD output on pipes

Use `wurlitzer.pipes` or `wurlitzer.sys_pipes` as context managers.
iÿÿÿÿ(   t   print_functions   1.0.3t   pipest	   sys_pipest   sys_pipes_forevert   stop_sys_pipest	   Wurlitzer(   t   contextmanagerN(   t   fcntlt   F_GETFLt   F_SETFL(   t   Queuet   stdoutt   stderrt	   __stdoutpt	   __stderrpi   i   t   encodingt   utf8t   asciic         C  s   d } xs t t d | ƒ ƒ D][ } y t j |  | ƒ SWq t k
 rw } | } | j t j k rq t j	 d ƒ qx ‚  q Xq W| r‹ | ‚ n  d S(   s    Like os.dup2, but retry on EBUSYi
   gš™™™™™¹?N(
   t   Nonet   ranget   intt   ost   dup2t   OSErrort   errnot   EBUSYt   timet   sleep(   t   at   bt   timeoutt   dup_errt   it   e(    (    s(   lib/python2.7/site-packages/wurlitzer.pyR   4   s    c           B  sn   e  Z d  Z d Z d d e d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z d
 „  Z RS(   si   Class for Capturing Process-level FD output via dup2
    
    Typically used via `wurlitzer.capture`
    gš™™™™™É?c         C  su   | |  _  | t k r$ |  j  |  _ n	 | |  _ | |  _ i  |  _ i  |  _ i  |  _ |  j |  j d <|  j |  j d <d S(   s3  
        Parameters
        ----------
        stdout: stream or None
            The stream for forwarding stdout.
        stderr = stream or None
            The stream for forwarding stderr.
        encoding: str or None
            The encoding to use, if streams should be interpreted as text.
        R   R   N(	   t   _stdoutt   STDOUTt   _stderrR   t	   _save_fdst	   _real_fdst	   _handlerst   _handle_stderrt   _handle_stdout(   t   selfR   R   R   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   __init__L   s    						c         C  s˜   t  t d | ƒ j ƒ  } t j | ƒ } | |  j | <t j ƒ  \ } } t | | ƒ t j | ƒ | |  j	 | <t
 | t ƒ } t
 | t | t j Bƒ | S(   Ns   __%s__(   t   getattrt   syst   filenoR   t   dupR%   t   pipeR   t   closeR&   R   R   R	   t
   O_NONBLOCK(   R*   t   namet   real_fdt   save_fdt   pipe_outt   pipe_int   flags(    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   _setup_pipec   s    c         C  s%   |  j  r! | j |  j  d ƒ } n  | S(   s\   Decode data, if any
        
        Called before passing to stdout/stderr streams
        t   replace(   R   t   decode(   R*   t   data(    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   _decoder   s    	c         C  s)   |  j  r% |  j  j |  j | ƒ ƒ n  d  S(   N(   R"   t   writeR=   (   R*   R<   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyR)   {   s    	c         C  s)   |  j  r% |  j  j |  j | ƒ ƒ n  d  S(   N(   R$   R>   R=   (   R*   R<   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyR(      s    	c         C  s   |  j  |  j f |  _ d S(   s   Setup handle for output, if anyN(   R"   R$   t   handle(   R*   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   _setup_handleƒ   s    c         C  s   d S(   sC   Finish handle, if anything should be done when it's all wrapped up.N(    (   R*   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   _finish_handle‡   s    c           sI  t  j t ƒ t  j t ƒ ˆ j ƒ  t j ƒ  \ ˆ _ ˆ _ ˆ j g ‰ i d ˆ j 6‰ ˆ j	 rŠ ˆ j
 d ƒ } ˆ j | ƒ d ˆ | <n  ˆ j r¼ ˆ j
 d ƒ } ˆ j | ƒ d ˆ | <n  t ƒ  ‰  ‡  f d †  } t j d | ƒ ‰ t ˆ _ ˆ j ƒ  ‡  ‡ ‡ ‡ ‡ f d †  } t j d | ƒ ˆ _ t ˆ j _ ˆ j j ƒ  ˆ j S(   Nt   controlR   R   c            sG   x@ t  rB ˆ  j ƒ  }  |  d k r% d  St j t ƒ t j t ƒ q Wd  S(   Nt   stop(   t   Truet   gett   libct   fflusht
   c_stdout_pt
   c_stderr_p(   t   msg(   t   flush_queue(    s(   lib/python2.7/site-packages/wurlitzer.pyt
   flush_main£   s    	t   targetc            s«  t  }  d } t j ƒ  } x( ˆ D]  } | j | t j t j Bƒ q Wx*ˆ ro| j t | d ƒ ƒ } | rt d } n# |  r~ Pn ˆ  j d ƒ ˆ j } qF xÈ | D]À \ } } | ˆ j	 k rõ t
 }  ˆ j ˆ j	 ƒ | j ˆ j	 ƒ t j ˆ j	 ƒ qž n  ˆ | } t j | d ƒ } | sAˆ j | ƒ | j | ƒ t j | ƒ qž t ˆ d | ƒ }	 |	 | ƒ qž Wˆ sF PqF qF Wˆ  j d ƒ ˆ j ƒ  g  ˆ D] }
 t j |
 ƒ ^ qŽd S(   s*   Forward bytes on a pipe to stream messagesi    iè  t   flushi   s
   _handle_%sRC   N(   t   Falset   selectt   pollt   registert   POLLINt   POLLPRIR   t   putt   flush_intervalt
   _control_rRD   t   removet
   unregisterR   R1   t   readR,   t   join(   t   drainingRV   t   pollert   pipe_t   eventst   fdR8   R3   R<   t   handlerR0   (   RK   t   flush_threadt   namesR   R*   (    s(   lib/python2.7/site-packages/wurlitzer.pyt	   forwarder¯   sD    			

(   RF   RG   RH   RI   R@   R   R0   RW   t
   _control_wR"   R9   t   appendR$   R
   t	   threadingt   ThreadRD   t   daemont   startt   threadR?   (   R*   R0   RL   Rd   (    (   RK   Rb   Rc   R   R*   s(   lib/python2.7/site-packages/wurlitzer.pyt	   __enter__‹   s0    
				
6c         C  sŸ   t  j t ƒ t  j t ƒ t j |  j d ƒ |  j j ƒ  t j	 |  j ƒ xD |  j
 j ƒ  D]3 \ } } |  j | } t | | ƒ t j	 | ƒ qZ W|  j ƒ  d  S(   Ns   (   RF   RG   RH   RI   R   R>   Re   Rk   R[   R1   R&   t   itemsR%   R   RA   (   R*   t   exc_typet	   exc_valuet	   tracebackR3   R4   R5   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   __exit__ë   s    N(   t   __name__t
   __module__t   __doc__RV   R   t   _default_encodingR+   R9   R=   R)   R(   R@   RA   Rl   Rq   (    (    (    s(   lib/python2.7/site-packages/wurlitzer.pyR   E   s   								`c         c  s‘  t  } } |  t k rv t j ƒ  \ } } t j | d ƒ } | r[ t j | d d | ƒ} n t j | d ƒ } t } n
 |  } } | t k r› d } | } nv | t k rt j ƒ  \ } } t j | d ƒ } | rì t j | d d | ƒ} n t j | d ƒ } t } n
 | } } | s| r&d }	 n | }	 t
 d | d | d |	 ƒ }
 z |
  | | f VWd QXWd | ry| j ƒ  n  | rŒ| j ƒ  n  Xd S(   s  Capture C-level stdout/stderr in a context manager.

    The return value for the context manager is (stdout, stderr).

    Examples
    --------

    >>> with capture() as (stdout, stderr):
    ...     printf("C-level stdout")
    ... output = stdout.read()
    t   wbt   rR   t   rbR   R   N(   RO   t   PIPER   R0   t   fdopent   iot   openRD   R#   R   R   R1   (   R   R   R   t   stdout_pipet   stderr_pipet   stdout_rt   stdout_wt   stderr_rt   stderr_wt   capture_encodingt   w(    (    s(   lib/python2.7/site-packages/wurlitzer.pyR   ý   s>    
	
		
	c         C  s   t  t j t j d |  ƒS(   sâ   Redirect C-level stdout/stderr to sys.stdout/stderr
    
    This is useful of sys.sdout/stderr are already being forwarded somewhere.
    
    DO NOT USE THIS if sys.stdout and sys.stderr are not already being forwarded.
    R   (   R   R-   R   R   (   R   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyR   4  s    c         C  s6   t  * t d k r, t |  ƒ a t j ƒ  n  Wd QXd S(   sv   Redirect all C output to sys.stdout/err

    This is not a context manager; it turns on C-forwarding permanently.
    N(   t   _mighty_lockt   _mighty_wurlitzerR   R   Rl   (   R   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyR   B  s    c           C  s9   t  - t d k	 r/ t j d d d ƒ d a n  Wd QXd S(   s7   Stop permanent redirection started by sys_pipes_foreverN(   R…   R†   R   Rq   (    (    (    s(   lib/python2.7/site-packages/wurlitzer.pyR   N  s    c         C  sJ   t  |  d ƒ s  t j d ƒ d S|  j j d t ƒ |  j j d t ƒ d S(   sº   Register me as an IPython extension
    
    Captures all C output during execution and forwards to sys.
    
    Does nothing on terminal IPython.
    
    Use: %load_ext wurlitzer
    t   kernels;   wurlitzer extension doesn't do anything in terminal IPythonNt   pre_executet   post_execute(   R,   t   warningst   warnR_   RR   R   R   (   t   ip(    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   load_ipython_extensionW  s    	c         C  s=   t  |  d ƒ s d S|  j j d t ƒ |  j j d t ƒ d S(   sJ   Unload me as an IPython extension
    
    Use: %unload_ext wurlitzer
    R‡   NRˆ   R‰   (   R,   R_   RY   R   R   (   RŒ   (    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   unload_ipython_extensioni  s    (0   Rt   t
   __future__R    t   __version__t   __all__t
   contextlibR   t   ctypesR   R   R   R	   R{   R   t   queueR
   t   ImportErrorRP   R-   Rg   R   RŠ   t   CDLLR   RF   t   c_void_pt   in_dllRH   RI   t
   ValueErrorR#   Ry   R,   t   stdinRu   t   lowerR   t   objectR   R   R   R†   t   LockR…   R   R   R   RŽ   (    (    (    s(   lib/python2.7/site-packages/wurlitzer.pyt   <module>   sZ   		¸6
			