B Œ=Ý_jfãN@s8dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddlmZddlmZddlmZydd lmZWnek rÀdZYnXydd lmZWnek rêdZYnXe jd krddlZndZe jdd kZd ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZgNZejd[kZejd\kZe j d]¡Ze j d^¡Z e Z!e j d_¡Z"e j d`¡Z#e j da¡Z$e"pe#pe$Z%e j db¡Z&e j dc¡Z'ddZ(deZ)dfZ*dgZ+dhZ,diZ-djZ.dkZ/dlZ0dmZ1dnZ2doZ3dpZ4dqZ5drZ6dsZ7dtZ8duZ9dvZ:dwZ;dxZd{Z?d|Z@d}ZAedkr°d~ZBdZCdZDn Gd€d„dejEƒZFeGƒ HeFjI¡edkräd‚ZJdƒZKn Gd„d…„d…ejEƒZLeGƒ HeLjI¡e  M¡ZNesd†ZOn2y e  P¡ZOWn$eQk rHer@d‡nd†ZOYnXedHdˆd‰dŠd‹dŒdgƒZRedDdˆd‰dŠd‹gƒZSedBdŽddd‘d’d“gƒZTedCd”d•d–d—d˜d™gƒZUedEdšd›dœddždŸd d¡gƒZVedId¢d£d¤d¥d¦gƒZWed@d§d¨d©dªd«d¬d¦gƒZXedFd¨d­d®d¯d°gƒZYedGd±d²d³d´gƒZZedAdµd¶d·d¸gƒZ[ed¹dºd»d¼gƒZ\ed½d¾dºd¿dÀgƒZ]edÁd‹dÂdÃgƒZ^edÄd¾dºgƒZ_ed8dÅdÆdÇdÈgƒZ`ed=dÉd§gƒZaed>dÊdËdÌgƒZbed?dÍdÎdÏgƒZced:dÍdÎdÏgƒZded;dŽddd‘gƒZeed>> @memoize ... def foo() ... return 1 ... >>> foo() 1 >>> foo.cache_clear() >>> csH|tt| ¡ƒƒf}yˆ|Stk rBˆ||Ž}ˆ|<|SXdS)N)Ú frozensetÚsortedÚitemsÚKeyError)röÚkwargsÚkeyrë)ÚcacheÚfunrr€Úwrappers zmemoize..wrappercs ˆ ¡dS)z Clear cache.N)Úclearr)rrr€Ú cache_clear˜szmemoize..cache_clear)Ú functoolsÚwrapsr )rrr r)rrr€rLs  cs6t ˆ¡‡fdd„ƒ}dd„}dd„}||_||_|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() >>> csPy|jˆ}Wn<tk r&ˆ|ƒStk rJˆ|ƒ}|jˆ<YnX|S)N)Ú_cacheÚAttributeErrorr)rèrë)rrr€r»sz'memoize_when_activated..wrappercSs i|_dS)zjActivate cache. Expects a Process instance. Cache will be stored as a "_cache" instance attribute.N)r )Úprocrrr€Úcache_activateÉsz.memoize_when_activated..cache_activatecSs"y|`Wntk rYnXdS)zDeactivate and clear cache.N)r r )rrrr€Úcache_deactivateÎsz0memoize_when_activated..cache_deactivate)r r rr)rrrrr)rr€Úmemoize_when_activated¡s rc CsVyt |¡}Wn6tk rD}z|jtjtjfkr4‚dSd}~XYnXt |j¡SdS)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Úerrrrr€rKÚsc CsNyt |¡Wn6tk rD}z|jtjtjfkr4‚dSd}~XYnXdSdS)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)rrrrrr)rÉrrrr€rNésc Cs`tjrtdkrdSy2t ttj¡}t |¡| d¡WdQRXdStjk rZdSXdS)z2Return True if IPv6 is supported on this platform.NF)z::1rT)ÚsocketÚhas_ipv6r rÚ contextlibÚclosingÚbindÚerror)Úsockrrr€rPøs cCszi}d}t}xh| d|¡}||kr$P| d||¡}||krj|||…}||d|…}|rb| ¡}|||<|d}qW|S)zCParse a C environ block of environment variables into a dictionary.rúú=rz)rÚfindÚupper)ÚdatarëÚposÚWINDOWS_Únext_posÚ equal_posrrÑrrr€rMs    cCs0tdkr |Sy t |¡Stk r*|SXdS)zConvert a numeric socket family value to an IntEnum member. If it's not a known member, return the numeric value itself. N)ÚenumrÚ AddressFamilyÚ ValueError)Únumrrr€rQ"s  cCs0tdkr |Sy t |¡Stk r*|SXdS)zConvert a numeric socket type value to an IntEnum member. If it's not a known member, return the numeric value itself. N)r,rÚ SocketKindr.)r/rrr€rR/s  cCs|tjtfkr&|rt|Ž}|r&t|Ž}|tjkrJ|ttfkrJ| |t¡}nt}t|ƒ}t|ƒ}|dkrxt ||||||ƒSt |||||||ƒSdS)z2Convert a raw connection tuple to a proper ntuple.N) rrr rÔrÚgetrrQrRr6r?)r§ÚfamÚtype_rªr«r¬Ú status_mapr¦rrr€rU<scs‡fdd„}|S)zƒA decorator which can be used to mark a method as deprecated 'replcement' is the method name which will be called instead. cs:d|jˆf‰|jdkrˆ|_t |¡‡‡fdd„ƒ}|S)Nz8%s() is deprecated and will be removed; use %s() insteadcs tjˆtddt|ˆƒ||ŽS)Nry)ÚcategoryÚ stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚgetattr)rèrör)rçÚ replacementrr€ÚinnerYsz/deprecated_method..outer..inner)r|rír r )rr<)r;)rçr€ÚouterSs   z deprecated_method..outerr)r;r=r)r;r€rJOs c@sBeZdZdZdd„Zdd„Zdd„Zdd „Zdd d „Zd d„Z d S)Ú _WrapNumberszNWatches numbers so that they don't overflow and wrap (reset to zero). cCs t ¡|_i|_i|_i|_dS)N)Ú threadingÚLockÚlockrÚ remindersÚ reminder_keys)rèrrr€ræfs z_WrapNumbers.__init__cCsT||jkst‚||jkst‚||jks*t‚||j|<ttƒ|j|<ttƒ|j|<dS)N)rÚAssertionErrorrBrCrÚintÚset)rèÚ input_dictr¢rrr€Ú _add_dictls  z_WrapNumbers._add_dictcCsd|j|}t| ¡ƒt| ¡ƒ}x<|D]4}x"|j||D]}|j||=qYnXg}xvtt|ƒƒD]f} || } || } || f} | | krÖ|j|| | 7<|j||  | ¡|  | |j|| ¡qˆWt |ƒ||<q>W||j|<|S)zkCache dict and sum numbers which overflow and wrap. Return an updated copy of `input_dict` ) rrHrNrIrÚrangeÚlenrBrCÚaddrôÚtuple) rèrGr¢rJÚnew_dictrÚ input_tupleÚ old_tupleÚbitsÚiÚ input_valueÚ old_valuerMrrr€Úruns2      z_WrapNumbers.runNc Csh|jX|dkr0|j ¡|j ¡|j ¡n*|j |d¡|j |d¡|j |d¡WdQRXdS)z>Clear the internal cache, optionally only for function 'name'.N)rArrrBrCÚpop)rèr¢rrr€r ¦s   z_WrapNumbers.cache_clearc Cs"|j|j|j|jfSQRXdS)z5Return internal cache dicts as a tuple of 3 elements.N)rArrBrC)rèrrr€Ú cache_info²sz_WrapNumbers.cache_info)N) r|r}r~rírærHrNrZr r\rrrr€r>as ' r>c Cstjt ||¡SQRXdS)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)Ú_wnrArZ)rGr¢rrr€rS¸scKst|df|ŽS)NÚrb)Úopen)Úfnamerrrr€Ú open_binaryÆsracKs*tr| dt¡| dt¡t|df|Ž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'). ÚencodingÚerrorsÚrt)ÚPY3Ú setdefaultr4r5r_)r`rrrr€Ú open_textÊs  rgú%(value).1f%(symbol)scCsŽd}i}x0t|dd…ƒD]\}}d|dd>||<qWx>t|dd…ƒD]*}|||krLt|ƒ||}|tƒSqLW|t|d|dS)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ÚYrzNé r)ÚsymbolrÑ)Ú enumerateÚreversedrûÚlocalsÚdict)ÚnÚformatÚsymbolsÚprefixrWÚsrsrÑrrr€rTØs  cCs tjdjS)z+Return updated psutil.PROCFS_PATH constant.rã)ÚsysÚmodulesÚ PROCFS_PATHrrrr€Úget_procfs_pathìsr€cCs|jttdS)N)rbrc)Údecoder4r5)r|rrr€ròsrcCs|S)Nr)r|rrr€rõscCs^tjdkrdSy2ddl}| ¡s$t‚| ¡| d¡dks>t‚Wntk rTdSXdSdS)Nr[TrÚcolorsF)rr¢ÚcursesÚisattyrDÚ setuptermÚtigetnumrå)Úfilerƒrrr€rXþs  Fc Cstƒs |Sg}tddddddddd d }d |d <y ||}Wn(tk rdtd t| ¡ƒƒ‚YnX| |¡|r~| d¡dd |¡|fS)z*Return an highlighted version of 'string'.Ú32Ú91Ú33Ú93Ú34Ú35Ú36Ú37Ú30) ÚgreenÚredÚbrownÚyellowÚblueÚvioletÚ lightblueÚgreyÚdarkgreyÚ29Nz#invalid color %r; choose between %sÚ1z [%sm%sú;)rXrwrr.ÚlistrIrôrõ)r|ÚcolorÚboldÚattrr‚rrr€rW s    c Cstƒst||dnêtr.tt|||ƒ|dnÐddl}d}|jjj}|jjj}t ddddd}||d<y ||}Wn,t k ržt d |t |  ¡ƒfƒ‚YnX|r´|dkr´|d 7}|tjkrÂd nd } |j|_|| ƒ} || |ƒzt||dWd|| |ƒXdS) z$Print a colorized version of string.)r‡rNéryr é)r‘r’r“r”z#invalid color %r; choose between %réiôÿÿÿiõÿÿÿ)rXÚprintrrWÚctypesÚwindllÚKernel32Ú GetStdHandleÚSetConsoleTextAttributerwrr.rrIr}ÚstderrÚc_ulongÚrestype) r|ržrŸr‡r¥Ú DEFAULT_COLORr¨r©r‚Ú handle_idÚhandlerrr€rY s0     Z PSUTIL_DEBUGcCs6t t ¡j¡\}}}}}td|||ftjddS)z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.zpsutil-debug [%s:%s]> %s)r‡N)ÚinspectÚ getframeinfoÚ currentframeÚf_backr¤r}rª)rçr`ÚlinenoÚ func_nameÚlinesÚindexrrr€rVFscCsdS)Nr)rçrrr€rVMs)N)N)rh)NF)ŽríÚ __future__rrrrr rrrr}r?r7Ú collectionsrrrrrr Ú ImportErrorr Ú version_infor,reÚ__all__r¢rrÚplatformÚ startswithrrrr rrrrÚAIXr*r+r'r,r.r2r&r0r1r(r)r/r-r3rr!r rrr"rrrrrrr#r$r%ÚIntEnumr{ÚglobalsÚupdateÚ __members__r„r…rƒÚgetfilesystemencodingr4r5Úgetfilesystemencodeerrorsr rGrCrArBrDrHr?rErFr@r¹r½rÁrÄr7r<r=r>r9r:r;r8r6rÔrIrårârïròr÷rørOrLrrKrNrPrMrQrRrUrJr>rSr]r r\rargrTr€rÚstdoutrXrWrYÚboolÚgetenvr°rVrrrr€Ús|                                          9   W    "