B =_E@sdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlZddlmZddlmZdd lmZdd lm Z dd lm!Z!dd lm"Z"dd lm#Z#ddl$m%Z%ddl$m&Z&ddl$m'Z'ddl(m)Z)ddl(m*Z*ddl(m+Z+ddl(m,Z,ddl(m-Z-ddl(m.Z.ddl(m/Z/ddl(m0Z0e+rddl1Z1nddl2Z1yddl1m3Z3Wn<e4k r(e5e6dddl3Z3WdQRXYnXej7dkr@ddl8Z8ndZ8ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gEZ9daej:kZ;de je=pe>Z?ej@ddkZAdeZBdfZCdgZDdhZEe?rFeBdi9ZBeEdi9ZEeCdi9ZCeDdi9ZDe jFdjkr`dke GZHn dle GZHe.dmZIe+rdnJdodpZKndqZKeLMdrkZNe jOPe jOQe jOReSdsdsZTe jOQeTdtZUe jOPe jOReSZVe!oe" ZWeXejYduZZeXedvZ[eXedwZ\eXejYdxZ]eXejYdyZ^eXejYdzZ_eXed{Z`eXejYd|ZaeXejYd}ZbeXejYd~ZceXedZdyedoxeeefZgWnehk rdZgYnXeXedZieXedZjeXejYdZke seoe ldkZmddZnenZoepe jqdZreserjtddeueDZvewedexZyezZ{ezZ|Gdddej}Z~ddZeddd<Zedd>Zdd=Zedd9ZeddZejeEfdd:Zddd;ZddQZddPZGdddexZeejdeEddddSZee*efdeEdddddTZeedeEddddRZddKZddZejddJZdddLZdddOZGddde1jZee1_GddDdDeZe1e;dGddCdCeZddGZddZGddEdEZGddFdFZddZeBfddBZddd@ZdddAZdddVZeedfddWZejfddXZdddYZddZZejdd[ZddUZddZdd\Zdd]Zdd^Zdd`Ze!rZejddd_Znejddd_ZejsddȄZe!reejddʄdS)z Test utilities. )print_functionN)AF_INET)AF_INET6) SOCK_STREAM)AIX)FREEBSD)LINUX)MACOS)POSIX)SUNOS)WINDOWS) bytes2human) print_color) supports_ipv6)FileExistsError)FileNotFoundError)PY3)range)super)u)unicode)which)mockignore)APPVEYORDEVNULLGLOBAL_TIMEOUTTOLERANCE_SYS_MEM NO_RETRIESPYPY PYTHON_EXEROOT_DIR SCRIPTS_DIR TESTFN_PREFIXUNICODE_SUFFIXINVALID_UNICODE_SUFFIX CI_TESTINGVALID_PROC_STATUSESTOLERANCE_DISK_USAGEIS_64BITHAS_CPU_AFFINITY HAS_CPU_FREQ HAS_ENVIRONHAS_PROC_IO_COUNTERS HAS_IONICEHAS_MEMORY_MAPSHAS_PROC_CPU_NUM HAS_RLIMITHAS_SENSORS_BATTERY HAS_BATTERYHAS_SENSORS_FANSHAS_SENSORS_TEMPERATURESZHAS_MEMORY_FULL_INFOpyrun terminate reap_childrenspawn_testproc spawn_zombiespawn_children_pairZThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespace print_sysinfoZ install_pipZinstall_test_depschdir safe_rmpath create_exeZ decode_pathZ encode_path get_testfn get_winverkernel_version call_until wait_for_pid wait_for_filecheck_net_address get_free_port bind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_sockets reload_moduleimport_module_by_pathwarncopyload_shared_lib is_namedtuple__pypy__GITHUB_ACTIONSZ CIBUILDWHEELl iPirjavaz $psutil-%s-z @psutil-%s-u-ƒőősfutf8surrogateescapeufÀ€)asciizus-asciiz..scripts cpu_affinitycpu_freq getloadavgenvironionice memory_mapsnet_io_counterscpu_num io_countersrlimitsensors_batteryF sensors_fanssensors_temperaturesthreadscCsdd}tr@tr$trtdStdStr6tjtj StdSnt r|tj p|tjtj p|tdtj ddp|t }|std|Stjtj }tj|st||SdS) NcSs:ytj|dgtjtjdWntk r0dSX|SdS)Nz-V)stdoutstderr) subprocess check_callPIPE Exception)exeryH/opt/alt/python37/lib64/python3.7/site-packages/psutil/tests/__init__.pyattempts z_get_py_exe..attemptZpypy3pypypythonz python%s.%sz"can't find python exe real abspath)r\r!rrrospathrealpathsys executabler version_infopsutilProcessrx ValueErrorexistsAssertionError)r{rxryryrz _get_py_exes$   rzr+cCs g|]}|drtt|qS)ZSTATUS_) startswithgetattrr).0xryryrz srAF_UNIXcsPeZdZdZfddZddZddZdd Zd d Zd d Z ddZ Z S) ThreadTaskz6A thread task which does nothing expect staying alive.cs$td|_d|_t|_dS)NFgMbP?)r__init___running _interval threadingEvent_flag)self) __class__ryrzrs zThreadTask.__init__cCs|jj}d||jt|fS)Nz<%s running=%s at %#x>)r__name__rid)rnameryryrz__repr__szThreadTask.__repr__cCs ||S)N)start)rryryrz __enter__szThreadTask.__enter__cOs |dS)N)stop)rargskwargsryryrz__exit__szThreadTask.__exit__cCs(|jrtdtj||jdS)zStart thread and keep it running until an explicit stop() request. Polls for shutdown every 'timeout' seconds. zalready startedN)rrrThreadrrwait)rryryrzrs zThreadTask.startcCs,d|_|jx|jr&t|jqWdS)NT)rrsettimesleepr)rryryrzruns zThreadTask.runcCs |jstdd|_|dS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)rrjoin)rryryrzrszThreadTask.stop) r __module__ __qualname____doc__rrrrrrr __classcell__ryry)rrzrs  rcstfdd}|S)Ncs,y ||Stk r&tYnXdS)N)rwr:)rr)funryrzwrapper%s  z&_reap_children_on_err..wrapper) functoolswraps)rrry)rrz_reap_children_on_err$srcKs|dt|dt|dt|dtjtrJd}|d||dkrt}zDt|d|}td |g}t j |f|}t |t |d d d Wdt|Xn"t j |f|}t |t|j|S) a}Creates a python subprocess which does nothing for 60 secs and return it as a subprocess.Popen instance. If "cmd" is specified that is used instead of python. By default stdin and stdout are redirected to /dev/null. It also attemps to make sure the process is in a reasonably initialized state. The process is registered for cleanup on reap_children(). stdinrrcwdenvi creationflagsNz:from time import sleep;open(r'%s', 'w').close();sleep(60);z-cT)deleteempty) setdefaultrrgetcwdrgr rIrGr"rtPopen_subprocesses_startedaddrNrMpid)cmdkwdsZCREATE_NO_WINDOWtestfnZpylinesprocryryrzr;/s,        cCsd}ttd}zvtdtj|tf}trDt |dd\}}n t |\}}t |j }t t|ddd}t|t |}||fSt||dk rt|XdS) aCreate a subprocess which creates another one as in: A (us) -> B (child) -> C (grandchild). Return a (child, grandchild) tuple. The 2 processes are fully initialized and will live for 60 secs and are registered for cleanup on reap_children(). N)dira; import subprocess, os, sys, time s = "import os, time;" s += "f = open('%s', 'w');" s += "f.write(str(os.getpid()));" s += "f.close();" s += "time.sleep(60);" p = subprocess.Popen([r'%s', '-c', s]) p.wait() r)rTF)rr)rIrrtextwrapdedentrbasenamer"r r8rrrintrN _pids_startedrrG)tfilerssubpchildZgrandchild_pidZ grandchildryryrzr=Ws      cstjs tt}td|}d}t|}z|tt |\}}| \}}zRt | gggtt |d}t|t|tfddd|fS|XWd|t||dk rt|XdS)zCreate a zombie process and return a (parent, zombie) process tuple. In order to kill the zombie parent must be terminate()d first, then zombie must be wait()ed on. a import os, sys, time, socket, contextlib child_pid = os.fork() if child_pid > 0: time.sleep(3000) else: # this is the zombie process s = socket.socket(socket.AF_UNIX) with contextlib.closing(s): s.connect('%s') if sys.version_info < (3, ): pid = str(os.getpid()) else: pid = bytes(str(os.getpid()), 'ascii') s.sendall(pid) NicsS)N)statusry)zombieryrzzspawn_zombie..zret == psutil.STATUS_ZOMBIE)rr rrIrrrR settimeoutrr8acceptselectfilenorrecvrrrrLcloserG)Z unix_filesrcrsockparentconn_Zzpidry)rrzr<~s,       c Ks|dd|ddt}yDt|d}||WdQRXtt|jgf|}t|j||fSt k rt |YnXdS)zRun python 'src' code string in a separate interpreter. Returns a subprocess.Popen instance and the test file where the source code was written. rrNrswt) rrIopenwriter;r"rrMrrwrG)rrsrcfilefrryryrzr8s    cKst|ttfrdnd}tr"|r"dnd}|d||dtj|dtj|dd|d |tj|f|}t |t r|j t d \}}n | \}}|j dkrt||rt||d r|d d }|S)zUrun cmd in a subprocess and return its output. raises RuntimeError on error. TFirshellrrrsuniversal_newlinesr)timeout N) isinstancestrrr rrtrvrrrr communicater returncode RuntimeErrorrXendswith)rrrflagsprrrsryryrzshs&        rc strddlmddddfdd}fd d fd d }d d}|}zVt|trp|||St|tjtjfr||St|tjr|||St d|Wdt|tjtjfr||t|tr|n|j }t |rt |XdS)aTerminate a process and wait() for it. Process can be a PID or an instance of psutil.Process(), subprocess.Popen() or psutil.Popen(). If it's a subprocess.Popen() or psutil.Popen() instance also closes its stdin / stdout / stderr fds. PID is wait()ed even if the process is already gone (kills zombies). Does nothing if the process does not exist. Return process exit status. r)wait_pidcSsbt|tjrts|n ||tr^t|tjr^yt|j|Stj k r\YnXdS)N) rrtrrrr rrr NoSuchProcess)procrryryrzrs  zterminate..waitcSs6trtrtj}tr(|tjkr(|tj||dS)N)r r\signalSIGKILLr send_signalSIGCONT)rsigryryrzsendsigs  zterminate..sendsigc sZy|Wn@tk rN}z"tr0|jdkr0n|jtjkr>Wdd}~XYnX||S)N)OSErrorr winerrorerrnoZESRCH)rrerr)rrrryrz term_subprocs zterminate..term_subproccs0y|Wntjk r$YnX||S)N)rr)rr)rrrryrz term_psprocs zterminate..term_psproccsByt|}Wn$tjk r2tr.||SYn X||SdS)N)rrrr )rrr)rrryrzterm_pids zterminate..term_pidcSs4|jr|j|jr |j|jr0|jdS)N)rrrrsr)rryryrz flush_popens   zterminate..flush_popenz wrong type %rN) r Zpsutil._psposixrrrrrrrt TypeErrorr pid_existsr)Z proc_or_pidr wait_timeoutrrrrrry)rrrrrrzr9s*            cCstj|d}xtr(t}t|qWxtrBt}t|q,W|rx|D]}t|ddqNWtj|td\}}x&|D]}t d|t|t j dqzWdS)aTerminate and wait() any subprocess started by this test suite and any children currently running, ensuring that no processes stick around to hog resources. If resursive is True it also tries to terminate and wait() all grandchildren started by this process. ) recursiveN)r)rz0couldn't terminate process %r; attempting kill())r) rrchildrenrpopr9r wait_procsrrXrr)rrrrrZgonealiveryryrzr:3s      cCsts tdd}td}x(|D] }|s6|dkr@||7}q"Pq"W|sVtd|d}d}|d}t|d}t|dkrt|d}t|dkrt|d}|||fS) z"Return a tuple such as (2, 6, 36).z not POSIXr~.zcan't parse %rrr) r NotImplementedErrorrunameisdigitrsplitrlen)rrcminormicronumsmajorryryrzrKXs&          cCsdts tdt}t|dr*|jp&d}n(td|d}|rNt| d}nd}|d|d|fS)Nz not WINDOWSservice_pack_majorrz\s\d$rr ) r r rgetwindowsversionhasattrrresearchrgroup)ZwvsprryryrzrJps  c@s<eZdZdZeddddfddZddZdd Zd d ZdS) retryzA retry decorator.NgMbP?cCs2|r|rtd||_||_||_||_||_dS)Nz/timeout and retries args are mutually exclusive)r exceptionrretriesintervallogfun)rr rr!r"r#ryryrzrszretry.__init__ccs`|jr.t|j}xFt|kr*dVqWn.|jrPx&t|jD] }dVq@Wn x dVqRWdS)N)rrr!r)rstop_atrryryrz__iter__s  zretry.__iter__cCs|jdk rt|jdS)N)r"rr)rryryrzrs z retry.sleepcs"tfdd}|_|S)Nc std}x^D]V}y ||Sjk r^}z&|}jdk rD|w Wdd}~XYq Xq Wtrn|ndS)N)r r#rr)rrexcr)rrryrzrs    zretry.__call__..wrapper)rr decorator)rrrry)rrrz__call__szretry.__call__) rrrrrwrr%rr(ryryryrzrs  rgMbP?)r r#rr"cCst|trtddS)zWait for pid to show up in the process list then return. Used in the test suite to give time the sub process to initialize. g{Gz?N)rrr rr)rryryrzrMs Tc Cs:t|d}|}WdQRX|s*|s*t|r6t||S)z8Wait for a file to be written on disk with some content.rbN)rreadrrG)fnamerrrdataryryrzrNs cCs|}t|st|S)zVKeep calling function for timeout secs and exit if eval() expression is True. )evalr)rexprretryryrzrLs cCsndd}yLt|}t|jr0ttj|}nttj|}t rJ|n||Wnt k rhYnXdS)z>Convenience function for removing temporary test files or dirsc Sstt}xjt|krvy|Stk r4Yn6tk rh}z|}tdt|Wdd}~XYnXtdqW|dS)Nz ignoring %sg{Gz?)rrrZ WindowsErrorrXrr)rr$rrryryrz retry_funs "zsafe_rmpath..retry_funN) rstatS_ISDIRst_moderpartialshutilrmtreeremover r)rr0strryryrzrGs   cCs(yt|Wntk r"YnXdS)z-Convenience function for creating a directoryN)rmkdirr)rryryrz safe_mkdirsr:c cs.t}zt|dVWdt|XdS)z@Context manager which temporarily changes the current directory.N)rrrF)dirnamecurdirryryrzrFs   c Cstj|rt||rtds(tdt|tr int main() { pause(); return 1; } z.c)suffixrNz-o)rrrrrrrboolrrrrrIrrtrurrGr5copyfiler"r r1chmodr3S_IEXEC)ZoutpathZc_coderr8ryryrzrHs"   r cCs2x,tjt||d}tj|stj|SqWdS)zReturn an absolute pathname of a file or dir that did not exist at the time this call is made. Also schedule it for safe deletion at interpreter exit. It's technically racy but probably not really due to the time variant. )prefixr>rN)tempfilemktempr%rrrr)r>rrryryrzrI9s c@s4eZdZddZeejds$ejjZe s0ddZ dS)TestCasecCs.|jj}|dsd|}d||jj|jfS)Nzpsutil.z psutil.tests.z%s.%s.%s)rrrrZ_testMethodName)rZfqmodryryrz__str__Ns  zTestCase.__str__assertRaisesRegexcCsdS)Nry)rryryrzrunTest\szTestCase.runTestN) rrrrGrunittestrFZassertRaisesRegexprHrrIryryryrzrFJs  rFc@sBeZdZdZdddZddZdd Zd d Zd d ZddZ dS)rBzUTest class providing auto-cleanup wrappers on top of process test utilities. r NcCst||d}|t||S)N)r>r)rI addCleanuprG)rr>rr+ryryrzrIis  zPsutilTestCase.get_testfncOst||}|t||S)N)r;rKr9)rrrrryryrzr;ns  zPsutilTestCase.spawn_testproccCs*t\}}|t||t|||fS)N)r=rKr9)rZchild1Zchild2ryryrzr=ss   z"PsutilTestCase.spawn_children_paircCs*t\}}|t||t|||fS)N)r<rKr9)rrrryryrzr<ys   zPsutilTestCase.spawn_zombiecOs*t||\}}|t||t||S)N)r8rKrGr9)rrrrrryryrzr8s  zPsutilTestCase.pyruncCs|tjtj|jt|tjtjfrn|r2ty | }Wntjk rTYnXtd||j ddt |jrt|j| |jt dS)Nz3Process.status() didn't raise exception (status=%s)r)r) assertRaisesrrrrrr is_runningrrrrZ assertNotInpids)rrrryryrzassertProcessGones   z PsutilTestCase.assertProcessGone)r N) rrrrrIr;r=r<r8rOryryryrzrBds zunreliable on PYPYc@s~eZdZdZdZdZdZer dndZdZ e Z ddZ d d Zd d Zd dZddZddZddZdddZddZdS)rAaTest framework class for detecting function memory leaks, typically functions implemented in C which forgot to free() memory from the heap. It does so by checking whether the process memory usage increased before and after calling the function many times. Note that this is hard (probably impossible) to do reliably, due to how the OS handles memory, the GC and so on (memory can even decrease!). In order to avoid false positives, in case of failure (mem > 0) we retry the test for up to 5 times, increasing call repetitions each time. If the memory keeps increasing then it's a failure. If available (Linux, OSX, Windows), USS memory is used for comparison, since it's supposed to be more precise, see: https://gmpy.dev/blog/2016/real-process-memory-and-environ-in-python If not, RSS memory is used. mallinfo() on Linux and _heapwalk() on Windows may give even more precision, but at the moment are not implemented. PyPy appears to be completely unstable for this framework, probably because of its JIT, so tests on PYPY are skipped. Usage: class TestLeaks(psutil.tests.TestMemoryLeak): def test_fun(self): self.execute(some_function) r]rr^TcCs|j}t|d|jS)NZuss) _thisprocmemory_full_inforZrss)rmemryryrz_get_mems zTestMemoryLeak._get_memcCstr|jS|jSdS)N)r rQnum_fds num_handles)rryryrz _get_num_fdss zTestMemoryLeak._get_num_fdscCs|jrt|dtjddS)Nyellow)colorfile)verboserrrs)rmsgryryrz_logszTestMemoryLeak._logcCsx|}|||}||}|dkr8|d||dkrttrHdnd}|dkr\|d7}d|||f}||dS) zMakes sure num_fds() (POSIX) or num_handles() (Windows) does not increase after calling a function. Used to discover forgotten close(2) and CloseHandle syscalls. rzHnegative diff %r (gc probably collected a resource from a previous test)fdhandler rz%s unclosed %s after calling %rN)rWcallfailr )rrbeforeafterdifftype_r\ryryrz _check_fdss  zTestMemoryLeak._check_fdscCsbtjdd|}xt|D]}||}~~qWtjdd|}|tjg||}|S)zGet 2 distinct memory samples, before and after having called fun repeadetly, and return the memory difference. r )Z generation)gcZcollectrTrr`Z assertEqualZgarbage)rrtimesZmem1rr/Zmem2rdryryrz _call_ntimess   zTestMemoryLeak._call_ntimesc Csg}d}|}xtd|dD]} |||} d| t| t| ||f} || | |kp`| |k} | r|| dkrx|| dS| dkrt|| ||7}| }qW|d|dS)Nrr z,Run #%s: extra-mem=%s, per-call=%s, calls=%sz. )rrir appendr]printrar) rrrh warmup_timesr! tolerancemessagesZprev_memZincreaseidxrSr\successryryrz _check_mems&    zTestMemoryLeak._check_memcCs|S)Nry)rrryryrzr`szTestMemoryLeak.callNc Cs|dk r |n|j}|dk r|n|j}|dk r0|n|j}|dk rB|n|j}yD|dksZtd|dksjtd|dksztd|dkstdWn.tk r}ztt|Wdd}~XYnX||||||j |||||ddS) zTest a callable.Nr ztimes must be >= 1rzwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rhrlr!rm) rhrlr!rmrrrrirfrq)rrrhrlr!rmrryryrzexecute s     zTestMemoryLeak.executec s"fdd}j|f|dS)znConvenience method to test a callable while making sure it raises an exception on every call. csdS)N)rLry)r&rrryrzr`"sz*TestMemoryLeak.execute_w_exc..callN)rr)rr&rrr`ry)r&rrrz execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)rrrrrhrlrmr(r!r[rrrQrTrWr]rfrirqr`rrrsryryryrzrAs"  cCsddl}ddl}ddl}ddl}ddl}ddl}y ddl}Wntk rTd}YnXy ddl}Wntk rzd}YnX| }t j rt drt d|d<n~t jrd|d|d<nbt jrddtt||d<t|dr|dd |7<nd ||f|d<d t||g|d <t jrV|d |d <d ||| g|d<t!|dd|d<|dk r|dd|j"7<t jrt drt ddg} t| #dd|d<nd|d<|$d} | r| |d<t%&|d<|'} d| d| df|d<|j(t )*d|d<|j+*d|d<|,|d<t-j./d|d <t-0|d!<t1|d"<|2|d#<t-3|d$<t 4|d%<d&t5d'd(t 6D|d)<t 7} d*t8| j9t:| j;t:| j<f|d+<t =} d*t8| j9t:| j;t:| j<f|d,<t>t ?|d-<t @A}|Bd.d|C||d/<tDd0t%jEd1x0|FD]$\}}tDd2|d3|ft%jEd1qpWtDd0t%jEd1t%jGHdS)4NrZ lsb_releasezlsb_release -d -sZOSz Darwin %szWindows  win32_editionz, z%s %sarchr~kernelr} __version__z not installedpipz (wheel=%s)r=z --versionrr glibcz fs-encodingz%s, %slangz%Y-%m-%d %H:%M:%Sz boot-timeruser~homerZpyexehostnameZPIDZcpusz%.1f%%, %.1f%%, %.1f%%cSsg|]}|tdqS)d)r cpu_count)rrryryrzrpsz!print_sysinfo..Zloadavgz%s%%, used=%s, total=%sZmemoryswaprNrirzF======================================================================)rZz%-17s %s:)I collectionsdatetimegetpasslocaleplatformpprintry ImportErrorwheel OrderedDictrrrrOSXmac_verr rmapr win32_verrrusystemversionlist architecturemachiner rpython_implementationpython_versionpython_compilerrrxrlibc_verrgetfilesystemencoding getlocale fromtimestamp boot_timestrftimenowZgetuserrr expanduserrr"nodegetpidrtuplerfvirtual_memoryrpercentr usedtotal swap_memoryrrNras_dictrpformatrkrsitemsrrflush)rrrrrrryrinfooutrr{rSrZpinfokvryryrzrE(s               ""   cCs6t}t|dr|St|dr2t|SdS)Nrkrdr)rrrrkrandomchoicerd)rryryrz_get_eligible_cpus   rc@sBeZdZdZddifddifgZddifddddifd difd difd difd difd difddifddifg Zddifddddifddifddifddifddifddifddifddifddifddifddifddifd difd!difd"difd#difgZerFed$difg7Zed%difg7Zed&difg7Zed'difg7Zer\ed(difg7Ze rred)difg7Ze red*e j fifg7Ze red+difg7Zered,difg7Zered-difg7Zered.difg7Zered/dd0d1ifg7ZgZereddifg7Znede jfifg7Ze rJed*e j d2fifg7Ze rerned)e jd3fifg7Zned)e jfifg7Ze red+egfifg7Zd4ejfifd5difd6difd7difd8difgZered4ejfifg7Zed4ejfifg7ZeeeeZd9d:ZdDd;d<Zd=d>Z e!d?d@Z"e!dAdBZ#dCS)ErCaA container that lists all Process class method names + some reasonable parameters to be called with. Utility methods (parent(), children(), ...) are excluded. >>> ns = process_namespace(psutil.Process()) >>> for fun, name in ns.iter(ns.getters): ... fun() cpu_percentryZmemory_percentrrrTrMZmemory_info_exZoneshotrparentsrr)rZcmdlineZ connectionskindall cpu_timesZ create_timerrxrRZ memory_inforniceZnum_ctx_switches num_threadsZ open_filesppidrrqusernameZuidsZgidsterminalrUrlrhrmrdrkrgrVriZgroupedF)iirrZsuspendZresumer9killcCs ||_dS)N)_proc)rrryryrzrszprocess_namespace.__init__ccs^t|}t|xF|D]>\}}}|r.|t|j|}tj|f||}||fVqWdS)z_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)rrshuffle clear_cacherrrr4)rlsrfun_namerrrryryrziters  zprocess_namespace.itercCs|jj|jjdddS)z&Clear the cache of a Process instance.T)Z _ignore_nspN)r_initr)rryryrzrszprocess_namespace.clear_cachecCsBx<|D]4\}}}d|}t||sd|jj|f}t|qWdS)z}Given a TestCase instance and a list of tuples checks that the class defines the required test method names. Ztest_z$%r class should define a '%s' methodN)rrrAttributeError)clsZ test_classrrrZ meth_namer\ryryrztest_class_coverages  z%process_namespace.test_class_coveragecCs`tdd|jD}tdd|jD}tddttjD}||B|A}|r\td|dS)NcSsg|] }|dqS)rry)rrryryrzr sz*process_namespace.test..cSsg|] }|dqS)rry)rrryryrzrscSsg|]}|ddkr|qS)rrry)rrryryrzrsz!uncovered Process class names: %r)rrignoredrrrr)rthisrklassZleftoutryryrztest s  zprocess_namespace.testN)T)$rrrrutilsrgettersr r/r0r3rZ RLIMIT_NOFILEr,r2r.r r1ZsettersZNORMAL_PRIORITY_CLASSrZIOPRIO_CLASS_NONEZ IOPRIO_NORMALrrSIGTERMZkillersZ CTRL_C_EVENTZCTRL_BREAK_EVENTrrrr classmethodrrryryryrzrCs         c@seZdZdZddifddddifddddifddifd dd difd dd difd dd difd dddifdefifddddifddifddifddddifdefifddifddifddifddifgZereddd difg7Ze reddifg7Ze reddifg7Ze r$eddifg7Ze r:eddifg7Ze r`ed difg7Zed!d"ifg7Zd#difd$egfifd%difd&difgZeZed'd(ZejZd)S)*rDzA container that lists all the module-level, system-related APIs. Utilities such as cpu_percent() are excluded. Usage: >>> ns = system_namespace >>> for fun, name in ns.iter(ns.getters): ... fun() rryrZlogicalFTZ cpu_statsrZpercpuZdisk_io_countersZperdiskZdisk_partitionsr disk_usageZnet_connectionsrZ net_if_addrsZ net_if_statsrjZpernicrrNrZusersrrerfrprornZwin_service_iterZwin_service_get)ZalgZ process_iterrrZcpu_times_percentccsPt|}t|x8|D]0\}}}tt|}tj|f||}||fVqWdS)z_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)rrrrrrr4)rrrrrryryrzrHs   zsystem_namespace.iterN)rrrrrrrrr-HAS_GETLOADAVGr7r6r4r rrrr staticmethodrrCrryryryrzrDsN           cCst|st|d|_|S)zA decorator to mark a TestCase class. When running parallel tests, class' unit tests will be run serially (1 process). T)inspectisclassrZ _serialrun)rryryrz serialrunWsrcCsdd}ttd||dS)zZDecorator which runs a test function and retries N times before actually failing. cSstd|tjddS)Nz %r, retrying)rZ)rkrrs)r&ryryrzr#esz retry_on_failure..logfunN)r rr!r#)rr)r!r#ryryrzr@ascsfdd}|S)z,Decorator to Ignore AccessDenied exceptions.cstfdd}|S)Ncs>y ||Stjk r8dk r*s*tdYnXdS)Nzraises AccessDenied)r AccessDeniedrJSkipTest)rr)ronly_ifryrzros z9skip_on_access_denied..decorator..wrapper)rr)rr)r)rrzr'ns z(skip_on_access_denied..decoratorry)rr'ry)rrzr>ls csfdd}|S)z3Decorator to Ignore NotImplementedError exceptions.cstfdd}|S)NcsFy ||Stk r@dk r(s(dj}t|YnXdS)Nz4%r was skipped because it raised NotImplementedError)r rrJr)rrr\)rrryrzrs z;skip_on_not_implemented..decorator..wrapper)rr)rr)r)rrzr'~s z*skip_on_not_implemented..decoratorry)rr'ry)rrzr?|s 127.0.0.1c Cs4tt}||df|dSQRXdS)z6Return an unused TCP port. Subject to race conditions.rr N) contextlibclosingsocketbind getsockname)hostrryryrzrPscCs|dkr|ttfkrd}t||}y>tjdkrB|tjtjd|||tj kr`| d|St k r| YnXdS)zBinds a generic socket.N)r r)ntcygwinr r^) rrrrr setsockopt SOL_SOCKET SO_REUSEADDRrrlistenrwr)familytypeaddrrryryrzrQs     cCsrtjs ttj|rt|ttj|}y"|||tj krL| dWnt k rl| YnX|S)zBind a UNIX socket.r^) rr rrrrrrrrrrwr)rrrryryrzrRs   r rc Cstt|t}|||d|}t|t}y@|||}x(|\}}||krn||fS| qRWWnt k r| YnXWdQRXdS)z^Build a pair of TCP sockets connected to each other. Return a (server, client) tuple. r^N) rrrrrrrconnectrrr)rrZllrZcaddraryryrzrSs      cCstjs td}}y@t|tjd}|dttjtj}|d||Wn6t k r|dk rr| |dk r| YnX||fS)zBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. N)rr) rr rrRrr setblockingrrrwr)rserverZclientryryrzrTs   c csg}d}}z|ttjtj|ttjtjtrd|ttjtj|ttjtjtrt rt }t }t |\}}t |tjd}x|||fD]}||qW|VWdx|D] }| qWx ||fD]}|dk rt|qWXdS)z1Open as many socket families / types as possible.N)r)rjrQrrr SOCK_DGRAMrrr HAS_CONNECTIONS_UNIXrIrTrRrrG)ZsocksZfname1Zfname2s1s2Zs3rr+ryryrzrUs*    cCsddl}tr(tr(ts(t|tjs(t||tjkrdd| dD}t |dksZt|x*|D]"}d|krxdks`nt|q`Wtst |}| |nb|tj krt|tst|tst |}||n.|tjkrtd|dk st|n td |dS) z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNcSsg|] }t|qSry)r)rrryryrzr sz%check_net_address..r rz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r) ipaddressenumrr!rIntEnumrrrrrrZ IPv4AddressrrZ IPv6AddressrZAF_LINKrmatchr)rrrZoctsnumryryrzrOs&   "    cCsTdd}dd}dd}dd}d d }||||||||||d S) z*Check validity of a connection namedtuple.cSst|dk}t|dks$tt||d|jks.check_ntuplec Ss|jtttfkst|jtdk r:t|jtjsNt|nt|jtsNt||jtkrt |j|j }t |Ry| |jddfWn2t jk r}z|jtjkrWdd}~XYnXWdQRXn |jtkr|jtjkst|jdS)Nr)rrrrrrrrrrrrrrrerrorrZ EADDRNOTAVAILrr CONN_NONE)rrrryryrz check_family,s     z-check_connection_ntuple..check_familycSsttdt}|jtjtj|fks,t|jtdk rLt|jtj s`t|nt|jt s`t||jtjkr|j t j kst|j dS)NSOCK_SEQPACKET)rrobjectrrrrrrrrrrr)rrryryrz check_typeAs  z+check_connection_ntuple..check_typecSsx|j|jfD]}|jttfkrt|ts6tt||s.check_addrscSst|jtst|jddttD}|j|ks.check_status..) rrrrrrrrrrrr)rZvalidsryryrz check_statusZs z-check_connection_ntuple..check_statusNry)rrrrrrryryrzcheck_connection_ntuples    rcCsLyddl}t|dstWn"tk r<ddl}||SX||SdS)z,Backport of importlib.reload of Python 3.3+.rNreload) importlibrrimpr)moduler r ryryrzrVps  cCstjtj|d}tjddkr:ddl}|||Stjdddkrfddlm }||| Sddl }|j ||}|j |}|j||SdS)Nrr~)rr)SourceFileLoader)rrsplitextrrrr Z load_sourceZimportlib.machineryr  load_moduleimportlib.utilutilspec_from_file_locationmodule_from_specloader exec_module)rrr r r specmodryryrzrW}s    cCst|tdS)zRaise a warning msg.N)warningsrX UserWarning)r\ryryrzrXscCsVt|}|j}t|dks&|dtkr*dSt|dd}t|tsDdStdd|DS)z-Check if object is an instance of namedtuple.r rF_fieldsNcss|]}t|tkVqdS)N)rr)rnryryrz sz is_namedtuple..)r __bases__rrrrr)rtbrryryrzrZs  c#sttrdnddt|d}fddtD}t|}t||zt ||VWdt |XdS)zCtx manager which picks up a random shared CO lib used by this process, copies it in another location and loads it in memory via ctypes. Return the new absolutized path. r|r}z.so)r>cs6g|].}tj|jdkr|jkr|jqS)r )rrr lower)rr)rxextryrzrsz'copyload_shared_lib..N) r!rIrrrirrr5r@ctypesCDLLrG)r>dstlibsrry)rxr rzrYs     c #sddlm}ddlm}dt|d}fddtD}trb|sbddtD}t |}t ||d }zt |}|VWd |d k rtj jj}|jg|_||j}|dkr|t|Xd S) zCtx manager which picks up a random shared DLL lib used by this process, copies it in another location and loads it in memory via ctypes. Return the new absolutized, normcased path. r)wintypes)WinErrorz.dll)r>csFg|]>}|jrdtj|jkrd|jkr|jqS)r}Zwow64)rrrrr)rr)r ryrzrsz'copyload_shared_lib..cSs(g|] }dtj|jkr|jqS)r|)rrrr)rrryryrzrsN)r!r%r&rIrrrir!rrr5r@ZWinDLLwindllkernel32 FreeLibraryZHMODULEargtypes_handlerG) r>r%r&r#r$rcfiler)r/ry)r rzrYs(         cCstdddS)NT)r)r:ryryryrzcleanup_test_procssr-cCs t|S)N)rexit)rframeryryrzrrr)N)F)TF)N)r N)N)N)r)r)r )r )r __future__ratexitrr!rrrgrrrrrr5rrr1rtrrDrrrrrrrrrrrr r r r Zpsutil._commonr rrZpsutil._compatrrrrrrrrrJZ unittest2rrcatch_warnings simplefilterrr__all__builtin_module_namesr!rgrr\r(maxsizer+r rr*rrrr%r&decoder'rrZASCII_FSrrrr;__file__r#r$HERErrrr,r-rr.r0r1ZHAS_NET_IO_COUNTERSr2r/r3r4r?rnr5rwr6r7Z HAS_THREADSgetuidZ SKIP_SYSCONSrr"rdevnullrregisterrrr)rrrrrrrrrr;r=r<r8rrr9r:rKrJrrrMrrNrLrGr:contextmanagerrFrHrIrFrBZskipIfrArErrCrDrr@r>r?rPrQrRrSrTrUrOrrVrWrXrZrYr-ryryryrz s                                                        0  ' '-  X %:   !  1[  B    R   ,