B
    "„OcDn  ã            R   @   sb  d Z ddlmZ ddl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	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 ddl	mZ ddl	mZ ydd	l	mZ W n ek
rÄ   dZY nX ydd
l	mZ W n ek
rî   dZY nX ejdkrddlZndZejd dkZee dd¡ƒZeƒ Zddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_gRZejd`kZejdakZ ej! "db¡Z#ej! "dc¡Z$e$Z%ej! "dd¡Z&ej! "de¡Z'ej! "df¡Z(e&p8e'p8e(Z)ej! "dg¡Z*ej! "dh¡Z+diZ,djZ-dkZ.dlZ/dmZ0dnZ1doZ2dpZ3dqZ4drZ5dsZ6dtZ7duZ8dvZ9dwZ:dxZ;dyZ<dzZ=d{Z>d|Z?d}Z@d~ZAdZBd€ZCdZDd‚ZEedkrÒdƒZFd„ZGdZHn G d…d†„ d†ejIƒZJeKƒ  LeJjM¡ edkrd‡ZNdˆZOn G d‰dŠ„ dŠejIƒZPeKƒ  LePjM¡ e Q¡ ZRes:d‹ZSn2ye T¡ ZSW n$ eUk
rj   erbdŒnd‹ZSY nX edIddŽddd‘d’gƒZVedEddŽddgƒZWedCd“d”d•d–d—d˜gƒZXedDd™dšd›dœddžgƒZYedFdŸd d¡d¢d£d¤d¥d¦gƒZZedJd§d¨d©dªd«gƒZ[edAd¬d­d®d¯d°d±d«gƒZ\edGd­d²d³d´dµgƒZ]edHd¶d·d¸d¹dºgƒZ^edBd»d¼d½d¾gƒZ_ed¿dÀdÁdÂgƒZ`edÃdÄdÀdÅdÆgƒZaedÇddÈdÉgƒZbedÊdÄdÀgƒZced9dËdÌdÍdÎgƒZded>dÏd¬gƒZeed?dÐdÑdÒgƒZfed@dÓdÔdÕgƒZged;dÓdÔdÕgƒZhed<d“d”d•d–gƒZied=dÖd×gƒZjed:dØdÙgƒZked8d¬d­d®d¯d°d±gƒZledÚdÛdÜgƒZmeeegeegfeegegfegegfeegegfegegfeegeegfegeegfegeegfdÝœZnedk	r´en LegegfegegfdÞœ¡ edk	rÖen Ldßegeegfi¡ G dàdá„ dáeoƒZpG dâdã„ dãepƒZqG dädå„ dåeqƒZrG dædç„ dçepƒZsG dèdé„ déepƒZtd
dêdQ„ZudëdN„ Zvdìdí„ ZwdîdM„ ZxdïdP„ ZyevdðdR„ ƒZzdñdO„ Z{dòdS„ Z|dódT„ Z}ddôd[„Z~dõdL„ ZG död÷„ d÷ƒZ€dødU„ Ze€ƒ Z‚e‚jƒe_ƒe‚j„e_„dùZ…dúdW„ Z†dûdV„ Z‡ee‡fdüdX„ZˆefdýdY„Z‰ddÿdZ„ZŠd d„ Z‹erdd„ ZŒndd„ ZŒevejfdd^„ƒZŽddd]„Zddejfdd_„Zd	d\„ Z‘dS (  z9Common objects shared by __init__.py and _ps*.py modules.é    )Údivision)Úprint_functionN)Ú
namedtuple)ÚAF_INET)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚAF_INET6)ÚAF_UNIX)é   é   r
   ÚPSUTIL_DEBUGÚFREEBSDÚBSDÚLINUXÚNETBSDÚOPENBSDÚMACOSÚOSXÚPOSIXÚSUNOSÚWINDOWSÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_CLOSINGÚCONN_ESTABLISHEDÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_LAST_ACKÚCONN_LISTENÚ	CONN_NONEÚCONN_SYN_RECVÚCONN_SYN_SENTÚCONN_TIME_WAITÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNÚSTATUS_DEADÚSTATUS_DISK_SLEEPÚSTATUS_IDLEÚSTATUS_LOCKEDÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_STOPPEDÚSTATUS_SUSPENDEDÚSTATUS_TRACING_STOPÚSTATUS_WAITINGÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_ZOMBIEÚSTATUS_PARKEDÚENCODINGÚENCODING_ERRSr   ÚpconnÚ	pcputimesÚpctxswÚpgidsÚpioÚpioniceÚ	popenfileÚpthreadÚpuidsÚsconnÚ	scpustatsÚsdiskioÚ	sdiskpartÚ
sdiskusageÚsnetioÚsnicaddrÚ	snicstatsÚsswapÚsuserÚ	conn_tmapÚdeprecated_methodÚisfile_strictÚmemoizeÚparse_environ_blockÚpath_exists_strictÚusage_percentÚsupports_ipv6Úsockfam_to_enumÚsocktype_to_enumÚwrap_numbersÚ	open_textÚopen_binaryÚcatÚbcatÚbytes2humanÚconn_to_ntupleÚdebugÚhiliteÚterm_supports_colorsÚprint_colorÚposixÚntZlinuxÚdarwin)ZfreebsdZmidnightbsdZopenbsdZnetbsd)ZsunosZsolarisZaixZrunningZsleepingz
disk-sleepZstoppedztracing-stopZzombieZdeadz	wake-killZwakingZidleÚlockedZwaitingZ	suspendedZparkedZESTABLISHEDZSYN_SENTZSYN_RECVZ	FIN_WAIT1Z	FIN_WAIT2Z	TIME_WAITZCLOSEZ
CLOSE_WAITZLAST_ACKZLISTENZCLOSINGZNONEé   é   c               @   s   e Zd ZdZdZdZdS )Ú	NicDuplexrb   rc   r   N)Ú__name__Ú
__module__Ú__qualname__r#   r$   r%   © rh   rh   ú-lib/python3.7/site-packages/psutil/_common.pyrd   Œ   s   rd   éÿÿÿÿéþÿÿÿc               @   s   e Zd ZdZdZdS )ÚBatteryTimerj   rk   N)re   rf   rg   ÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDrh   rh   rh   ri   rl   ˜   s   rl   ÚreplaceÚsurrogateescapeÚtotalÚusedZfreeZpercentZsinZsoutZ
read_countZwrite_countZ
read_bytesZwrite_bytesZ	read_timeZ
write_timeZdeviceZ
mountpointZfstypeZoptsZmaxfileZmaxpathZ
bytes_sentZ
bytes_recvZpackets_sentZpackets_recvZerrinZerroutZdropinZdropoutÚnameZterminalZhostZstartedÚpidÚfdZfamilyÚtypeÚladdrÚraddrÚstatusZaddressZnetmaskZ	broadcastZptpZisupZduplexZspeedZmtuÚflagsZctx_switchesZ
interruptsZsoft_interruptsZsyscallsÚscpufreqZcurrentÚminÚmaxÚshwtempZlabelZhighZcriticalÚsbatteryZsecsleftZpower_pluggedÚsfanÚuserÚsystemÚchildren_userÚchildren_systemÚpathÚidZ	user_timeZsystem_timeÚrealZ	effectiveZsavedZioclassÚvalueZ	voluntaryZinvoluntaryÚaddrZipZport)ÚallZtcpZtcp4ZudpZudp4ZinetZinet4Zinet6)Ztcp6Zudp6Zunixc               @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚErrorzQBase exception class. All other psutil exceptions inherit
    from this one.
    Úpsutilc             C   sL   t  ¡ }x>|D ]6}t| |d ƒ}|r,|||< q|dkr|dkr|||< qW |S )Nrt   r   )ÚcollectionsÚOrderedDictÚgetattr)ÚselfZattrsÚinfors   rˆ   rh   rh   ri   Ú	_infodict  s    

zError._infodictc             C   sP   |   d¡}|r,dd dd„ | ¡ D ƒ¡ }nd }d dd„ t| dd	ƒ|fD ƒ¡S )
N)rt   Úppidrs   z(%s)z, c             S   s   g | ]\}}d ||f ‘qS )z%s=%rrh   )Ú.0ÚkÚvrh   rh   ri   ú
<listcomp>+  s    z!Error.__str__.<locals>.<listcomp>ú c             S   s   g | ]}|r|‘qS rh   rh   )r”   Úxrh   rh   ri   r—   .  s    ÚmsgÚ )r’   ÚjoinÚitemsr   )r   r‘   Údetailsrh   rh   ri   Ú__str__&  s    
zError.__str__c             C   s2   |   d¡}d dd„ | ¡ D ƒ¡}d| jj|f S )N)rt   r“   rs   Úsecondsrš   z, c             S   s   g | ]\}}d ||f ‘qS )z%s=%rrh   )r”   r•   r–   rh   rh   ri   r—   3  s    z"Error.__repr__.<locals>.<listcomp>zpsutil.%s(%s))r’   rœ   r   Ú	__class__re   )r   r‘   rž   rh   rh   ri   Ú__repr__0  s    
zError.__repr__N)re   rf   rg   Ú__doc__r’   rŸ   r¢   rh   rh   rh   ri   r‹     s
   

r‹   c               @   s   e Zd ZdZdZddd„ZdS )ÚNoSuchProcesszXException raised when a process with a certain PID doesn't
    or no longer exists.
    rŒ   Nc             C   s$   t  | ¡ || _|| _|pd| _d S )Nzprocess no longer exists)r‹   Ú__init__rt   rs   rš   )r   rt   rs   rš   rh   rh   ri   r¥   =  s    
zNoSuchProcess.__init__)NN)re   rf   rg   r£   r¥   rh   rh   rh   ri   r¤   7  s   r¤   c               @   s   e Zd ZdZdZddd„ZdS )ÚZombieProcessa1  Exception raised when querying a zombie process. This is
    raised on macOS, BSD and Solaris only, and not always: depending
    on the query the OS may be able to succeed anyway.
    On Linux all zombie processes are querable (hence this is never
    raised). Windows doesn't have zombie processes.
    rŒ   Nc             C   s$   t  | |||¡ || _|pd| _d S )Nz"PID still exists but it's a zombie)r¤   r¥   r“   rš   )r   rt   rs   r“   rš   rh   rh   ri   r¥   M  s    zZombieProcess.__init__)NNN)re   rf   rg   r£   r¥   rh   rh   rh   ri   r¦   D  s   r¦   c               @   s   e Zd ZdZdZddd„ZdS )ÚAccessDeniedz@Exception raised when permission to perform an action is denied.rŒ   Nc             C   s$   t  | ¡ || _|| _|pd| _d S )Nr›   )r‹   r¥   rt   rs   rš   )r   rt   rs   rš   rh   rh   ri   r¥   W  s    
zAccessDenied.__init__)NNN)re   rf   rg   r£   r¥   rh   rh   rh   ri   r§   S  s   r§   c               @   s   e Zd ZdZdZddd„ZdS )ÚTimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process
    is still alive.
    rŒ   Nc             C   s*   t  | ¡ || _|| _|| _d| | _d S )Nztimeout after %s seconds)r‹   r¥   r    rt   rs   rš   )r   r    rt   rs   rh   rh   ri   r¥   d  s
    
zTimeoutExpired.__init__)NN)re   rf   rg   r£   r¥   rh   rh   rh   ri   r¨   ^  s   r¨   c             C   sD   yt | ƒ| d }W n tk
r(   dS X |dk	r<t||ƒ}|S dS )z5Calculate percentage usage of 'used' against 'total'.éd   g        N)ÚfloatÚZeroDivisionErrorÚround)rr   rq   Zround_Úretrh   rh   ri   rO   q  s    
c                s2   t  ˆ¡‡ ‡fdd„ƒ}‡ fdd„}i ‰ ||_|S )a  A simple memoize decorator for functions supporting (hashable)
    positional arguments.
    It also provides a cache_clear() function for clearing the cache:

    >>> @memoize
    ... def foo()
    ...     return 1
        ...
    >>> foo()
    1
    >>> foo.cache_clear()
    >>>
    c                 sH   | t t| ¡ ƒƒf}yˆ | S  tk
rB   ˆ| |Ž }ˆ |< |S X d S )N)Ú	frozensetÚsortedr   ÚKeyError)ÚargsÚkwargsÚkeyr­   )ÚcacheÚfunrh   ri   Úwrapper‹  s    zmemoize.<locals>.wrapperc                  s   ˆ   ¡  dS )zClear cache.N)Úclearrh   )r´   rh   ri   Úcache_clear”  s    zmemoize.<locals>.cache_clear)Ú	functoolsÚwrapsr¸   )rµ   r¶   r¸   rh   )r´   rµ   ri   rL   }  s
    	c                s6   t  ˆ ¡‡ fdd„ƒ}dd„ }dd„ }||_||_|S )aú  A memoize decorator which is disabled by default. It can be
    activated and deactivated on request.
    For efficiency reasons it can be used only against class methods
    accepting no arguments.

    >>> class Foo:
    ...     @memoize
    ...     def foo()
    ...         print(1)
    ...
    >>> f = Foo()
    >>> # deactivated (default)
    >>> foo()
    1
    >>> foo()
    1
    >>>
    >>> # activated
    >>> foo.cache_activate(self)
    >>> foo()
    1
    >>> foo()
    >>> foo()
    >>>
    c                sj   y| j ˆ  }W nV tk
r&   ˆ | ƒS  tk
rd   ˆ | ƒ}y|| j ˆ < W n tk
r^   Y nX Y nX |S )N)Ú_cacheÚAttributeErrorr°   )r   r­   )rµ   rh   ri   r¶   ·  s    z'memoize_when_activated.<locals>.wrapperc             S   s
   i | _ dS )zjActivate cache. Expects a Process instance. Cache will be
        stored as a "_cache" instance attribute.N)r»   )Úprocrh   rh   ri   Úcache_activateË  s    z.memoize_when_activated.<locals>.cache_activatec             S   s"   y| ` W n tk
r   Y nX dS )zDeactivate and clear cache.N)r»   r¼   )r½   rh   rh   ri   Úcache_deactivateÐ  s    z0memoize_when_activated.<locals>.cache_deactivate)r¹   rº   r¾   r¿   )rµ   r¶   r¾   r¿   rh   )rµ   ri   Úmemoize_when_activated  s    rÀ   c          
   C   sV   yt  | ¡}W n6 tk
rD } z|jtjtjfkr4‚ dS d}~X Y nX t |j¡S dS )zœSame as os.path.isfile() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    FN)ÚosÚstatÚOSErrorÚerrnoÚEPERMÚEACCESÚS_ISREGÚst_mode)r…   ÚstÚerrrh   rh   ri   rK   Ü  s    c          
   C   sN   yt  | ¡ W n6 tk
rD } z|jtjtjfkr4‚ dS d}~X Y nX dS dS )zœSame as os.path.exists() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    FNT)rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   )r…   rÊ   rh   rh   ri   rN   ë  s    c           	   C   s`   t jrtdkrdS y2t   tt j¡} t | ¡ |  d¡ W dQ R X dS  t jk
rZ   dS X dS )z2Return True if IPv6 is supported on this platform.NF)z::1r   T)ÚsocketZhas_ipv6r   r   Ú
contextlibÚclosingZbindÚerror)Zsockrh   rh   ri   rP   ú  s    c             C   sz   i }d}t }xh|  d|¡}||kr$P |  d||¡}||krj| ||… }| |d |… }|rb| ¡ }|||< |d }qW |S )zCParse a C environ block of environment variables into a dictionary.r   ú ú=rc   )r   ÚfindÚupper)Údatar­   ÚposZWINDOWS_Znext_posZ	equal_posr³   rˆ   rh   rh   ri   rM     s     c             C   s0   t dkr| S y
t | ¡S  tk
r*   | S X dS )zConvert a numeric socket family value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)ÚenumrË   ZAddressFamilyÚ
ValueError)Únumrh   rh   ri   rQ   $  s    
c             C   s0   t dkr| S y
t | ¡S  tk
r*   | S X dS )zConvert a numeric socket type value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)rÕ   rË   Z
SocketKindrÖ   )r×   rh   rh   ri   rR   1  s    
c             C   s   |t jtfkr&|rt|Ž }|r&t|Ž }|t jkrJ|ttfkrJ| |t¡}nt}t|ƒ}t|ƒ}|dkrxt	| |||||ƒS t
| ||||||ƒS dS )z2Convert a raw connection tuple to a proper ntuple.N)rË   r   r   r‰   r   Úgetr   rQ   rR   r6   r?   )ru   ZfamZtype_rw   rx   ry   Z
status_maprt   rh   rh   ri   rY   >  s    c                s   ‡ fdd„}|S )zƒA decorator which can be used to mark a method as deprecated
    'replcement' is the method name which will be called instead.
    c                s:   d| j ˆf ‰ | jd krˆ | _t | ¡‡ ‡fdd„ƒ}|S )Nz8%s() is deprecated and will be removed; use %s() insteadc                s    t jˆ tdd t| ˆƒ||ŽS )Nrb   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚDeprecationWarningr   )r   r±   r²   )rš   Úreplacementrh   ri   Úinner[  s    z/deprecated_method.<locals>.outer.<locals>.inner)re   r£   r¹   rº   )rµ   rß   )rÞ   )rš   ri   ÚouterU  s    
z deprecated_method.<locals>.outerrh   )rÞ   rà   rh   )rÞ   ri   rJ   Q  s    c               @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	d
S )Ú_WrapNumberszNWatches numbers so that they don't overflow and wrap
    (reset to zero).
    c             C   s    t  ¡ | _i | _i | _i | _d S )N)Ú	threadingZLockÚlockr´   Ú	remindersÚreminder_keys)r   rh   rh   ri   r¥   h  s    
z_WrapNumbers.__init__c             C   sX   || j kst‚|| jkst‚|| jks*t‚|| j |< t t¡| j|< t t¡| j|< d S )N)r´   ÚAssertionErrorrä   rå   r   ÚdefaultdictÚintÚset)r   Ú
input_dictrs   rh   rh   ri   Ú	_add_dictn  s    
z_WrapNumbers._add_dictc             C   sd   | j | }t| ¡ ƒt| ¡ ƒ }x<|D ]4}x"| j| | D ]}| j| |= q<W | j| |= q(W dS )z†In case the number of keys changed between calls (e.g. a
        disk disappears) this removes the entry from self.reminders.
        N)r´   ré   Úkeysrå   rä   )r   rê   rs   Úold_dictZ	gone_keysZgone_keyÚremkeyrh   rh   ri   Ú_remove_dead_remindersv  s    

z#_WrapNumbers._remove_dead_remindersc          	   C   s  || j kr|  ||¡ |S |  ||¡ | j | }i }xÌ| ¡ D ]À}|| }y|| }W n tk
rt   |||< w>Y nX g }xvtt|ƒƒD ]f}	||	 }
||	 }||	f}|
|k rÖ| j| |  |7  < | j| |  	|¡ | 
|
| j| |  ¡ qˆW t|ƒ||< q>W || j |< |S )zkCache dict and sum numbers which overflow and wrap.
        Return an updated copy of `input_dict`
        )r´   rë   rï   rì   r°   ÚrangeÚlenrä   rå   ÚaddÚappendÚtuple)r   rê   rs   rí   Znew_dictr³   Zinput_tupleZ	old_tupleÚbitsÚiZinput_valueÚ	old_valuerî   rh   rh   ri   Úrun  s2    


z_WrapNumbers.runNc          	   C   sh   | j X |dkr0| j ¡  | j ¡  | j ¡  n*| j |d¡ | j |d¡ | j |d¡ W dQ R X dS )z>Clear the internal cache, optionally only for function 'name'.N)rã   r´   r·   rä   rå   Úpop)r   rs   rh   rh   ri   r¸   ¨  s    

z_WrapNumbers.cache_clearc          	   C   s"   | j  | j| j| jfS Q R X dS )z5Return internal cache dicts as a tuple of 3 elements.N)rã   r´   rä   rå   )r   rh   rh   ri   Ú
cache_info´  s    z_WrapNumbers.cache_info)N)
re   rf   rg   r£   r¥   rë   rï   rø   r¸   rú   rh   rh   rh   ri   rá   c  s   '
rá   c          	   C   s   t j t  | |¡S Q R X dS )zÅGiven an `input_dict` and a function `name`, adjust the numbers
    which "wrap" (restart from zero) across different calls by adding
    "old value" to "new value" and return an updated dict.
    N)Ú_wnrã   rø   )rê   rs   rh   rh   ri   rS   º  s    i €  c             C   s   t | dtdS )NÚrb)Ú	buffering)ÚopenÚFILE_READ_BUFFER_SIZE)Úfnamerh   rh   ri   rU   ×  s    c             C   sd   t st| dtdS t| dtttd}y
t|_W n0 tk
rB   Y n tk
r^   | ¡  ‚ Y nX |S )z¨On Python 3 opens a file in text mode by using fs encoding and
    a proper en/decoding errors handler.
    On Python 2 this is just an alias for open(name, 'rt').
    Zrt)rý   )rý   ÚencodingÚerrors)	ÚPY3rþ   rÿ   r4   r5   Ú_CHUNK_SIZEr¼   Ú	ExceptionÚclose)r   Zfobjrh   rh   ri   rT   Û  s    

c          	   C   s\   |t kr"|| ƒ
}| ¡ S Q R X n6y|| ƒ
}| ¡ S Q R X W n ttfk
rV   |S X dS )zÛRead entire file content and return it as a string. File is
    opened in text mode. If specified, `fallback` is the value
    returned in case of error, either if the file does not exist or
    it can't be read().
    N)Ú_DEFAULTÚreadÚIOErrorrÃ   )r   ÚfallbackÚ_openÚfrh   rh   ri   rV   õ  s    

c             C   s   t | |tdS )z,Same as above but opens file in binary mode.)r
  r  )rV   rU   )r   r
  rh   rh   ri   rW     s    ú%(value).1f%(symbol)sc             C   sŽ   d}i }x0t |dd… ƒD ]\}}d|d d > ||< qW x>t|dd… ƒD ]*}| || krLt| ƒ||  }|tƒ  S qLW |t|d | d S )zŒUsed by various scripts. See:
    http://goo.gl/zeJZl

    >>> bytes2human(10000)
    '9.8K'
    >>> bytes2human(100001221)
    '95.4M'
    )	ÚBÚKÚMÚGÚTÚPÚEÚZÚYrc   Né
   r   )Úsymbolrˆ   )Ú	enumerateÚreversedrª   ÚlocalsÚdict)ÚnÚformatZsymbolsÚprefixrö   Úsr  rˆ   rh   rh   ri   rX     s    	c               C   s   t jd jS )z+Return updated psutil.PROCFS_PATH constant.rŒ   )ÚsysÚmodulesZPROCFS_PATHrh   rh   rh   ri   Úget_procfs_path  s    r#  c             C   s   | j ttdS )N)r  r  )Údecoder4   r5   )r   rh   rh   ri   r$  %  s    r$  c             C   s   | S )Nrh   )r   rh   rh   ri   r$  (  s    c             C   s^   t jdkrdS y2dd l}|  ¡ s$t‚| ¡  | d¡dks>t‚W n tk
rT   dS X dS d S )Nr_   Tr   ÚcolorsF)rÁ   rs   ÚcursesÚisattyræ   Z	setuptermZtigetnumr  )Úfiler&  rh   rh   ri   r\   1  s    
Fc             C   s   t ƒ s
| S g }tddddddddd	d
	}d|d< y|| }W n( tk
rd   tdt| ¡ ƒ ƒ‚Y nX | |¡ |r~| d¡ dd |¡| f S )z*Return an highlighted version of 'string'.Z32Z91Z33Z93Z34Z35Z36Z37Z30)	ÚgreenÚredÚbrownÚyellowZblueZvioletZ	lightblueZgreyZdarkgreyZ29Nz#invalid color %r; choose between %sÚ1z[%sm%s[0mú;)r\   r  r°   rÖ   Úlistrì   ró   rœ   )r   ÚcolorÚboldÚattrr%  rh   rh   ri   r[   @  s    

c          	   C   s  t ƒ st| |d nêtr.tt| ||ƒ|d nÐddl}d}|jjj}|jjj}t	ddddd}||d< y|| }W n, t
k
rž   td	|t| ¡ ƒf ƒ‚Y nX |r´|dkr´|d
7 }|tjkrÂdnd}	|j|_||	ƒ}
||
|ƒ zt| |d W d||
|ƒ X dS )z$Print a colorized version of string.)r(  r   Né   rb   r   é   )r)  r*  r+  r,  z#invalid color %r; choose between %ré   iôÿÿÿiõÿÿÿ)r\   Úprintr   r[   ÚctypesZwindllZKernel32ÚGetStdHandleÚSetConsoleTextAttributer  r°   rÖ   r/  rì   r!  ÚstderrZc_ulongZrestype)r   r0  r1  r(  r7  ZDEFAULT_COLORr8  r9  r%  Z	handle_idZhandlerh   rh   ri   r]   S  s0    


c             C   sn   t rjddl}| | ¡ j¡\}}}}}t| tƒrRt| ttt	fƒrJd|  } nd|  } t
d||| f tjd dS )z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.r   Nzignoring %szignoring %rzpsutil-debug [%s:%s]> %s)r(  )r   ÚinspectZgetframeinfoZcurrentframeÚf_backÚ
isinstancer  rÃ   r	  ÚEnvironmentErrorr6  r!  r:  )rš   r;  r   ÚlinenoZ	func_nameÚlinesÚindexrh   rh   ri   rZ   v  s    

)N)N)r  )NF)’r£   Z
__future__r   r   r   rÌ   rÄ   r¹   rÁ   rË   rÂ   r!  râ   rÛ   r   r   r   r   r   ÚImportErrorr	   Úversion_inforÕ   r  ÚboolÚgetenvr   Úobjectr  Ú__all__rs   r   r   ÚplatformÚ
startswithr   r   r   r   r   r   r   r   ZAIXr*   r+   r'   r,   r.   r2   r&   r0   r1   r(   r)   r/   r-   r3   r   r!   r    r   r   r"   r   r   r   r   r   r   r#   r$   r%   ÚIntEnumrd   ÚglobalsÚupdateÚ__members__rm   rn   rl   Úgetfilesystemencodingr4   r5   Úgetfilesystemencodeerrorsr¼   rG   rC   rA   rB   rD   rH   r?   rE   rF   r@   r{   r~   r   r€   r7   r<   r=   r>   r9   r:   r;   r8   r6   r‰   rI   r  r‹   r¤   r¦   r§   r¨   rO   rL   rÀ   rK   rN   rP   rM   rQ   rR   rY   rJ   rá   rS   rû   r¸   rú   rÿ   rU   rT   rV   rW   rX   r#  r$  Ústdoutr\   r[   r]   rZ   rh   rh   rh   ri   Ú<module>   s†  



	

	







	




	! ?W		"