| Index: third_party/psutil/psutil/__init__.py
|
| diff --git a/third_party/psutil/psutil/__init__.py b/third_party/psutil/psutil/__init__.py
|
| index 09b7955f2434f32c32392723231e42ec95d188b4..93724fca1a97788acf6dcba48a57d255d329f8cd 100644
|
| --- a/third_party/psutil/psutil/__init__.py
|
| +++ b/third_party/psutil/psutil/__init__.py
|
| @@ -1,26 +1,35 @@
|
| #!/usr/bin/env python
|
| #
|
| -# $Id: __init__.py 806 2010-11-12 23:09:35Z g.rodola $
|
| +# $Id: __init__.py 1142 2011-10-05 18:45:49Z g.rodola $
|
| #
|
| +# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
|
|
| """psutil is a module providing convenience functions for managing
|
| -processes in a portable way by using Python.
|
| +processes and gather system information in a portable way by using
|
| +Python.
|
| """
|
|
|
| -__version__ = "0.2.0"
|
| +__version__ = "0.3.1"
|
| version_info = tuple([int(num) for num in __version__.split('.')])
|
|
|
| __all__ = [
|
| # exceptions
|
| - "Error", "NoSuchProcess", "AccessDenied",
|
| + "Error", "NoSuchProcess", "AccessDenied", "TimeoutExpired",
|
| # constants
|
| - "NUM_CPUS", "TOTAL_PHYMEM", "version_info", "__version__",
|
| + "NUM_CPUS", "TOTAL_PHYMEM", "BOOT_TIME",
|
| + "version_info", "__version__",
|
| + "STATUS_RUNNING", "STATUS_IDLE", "STATUS_SLEEPING", "STATUS_DISK_SLEEP",
|
| + "STATUS_STOPPED", "STATUS_TRACING_STOP", "STATUS_ZOMBIE", "STATUS_DEAD",
|
| + "STATUS_WAKING", "STATUS_LOCKED",
|
| # classes
|
| - "Process",
|
| + "Process", "Popen",
|
| # functions
|
| "test", "pid_exists", "get_pid_list", "process_iter", "get_process_list",
|
| - "avail_phymem", "used_phymem", "total_virtmem", "avail_virtmem",
|
| - "used_virtmem", "cpu_times", "cpu_percent",
|
| + "phymem_usage", "virtmem_usage"
|
| + "cpu_times", "per_cpu_times", "cpu_percent", "per_cpu_percent",
|
| + "network_io_counters", "disk_io_counters",
|
| ]
|
|
|
| import sys
|
| @@ -29,67 +38,58 @@ import time
|
| import signal
|
| import warnings
|
| import errno
|
| +import subprocess
|
| try:
|
| import pwd
|
| except ImportError:
|
| pwd = None
|
|
|
| -from psutil.error import Error, NoSuchProcess, AccessDenied
|
| +from psutil.error import Error, NoSuchProcess, AccessDenied, TimeoutExpired
|
| +from psutil._compat import property
|
| +from psutil._common import (STATUS_RUNNING, STATUS_IDLE, STATUS_SLEEPING,
|
| + STATUS_DISK_SLEEP, STATUS_STOPPED,
|
| + STATUS_TRACING_STOP, STATUS_ZOMBIE, STATUS_DEAD,
|
| + STATUS_WAKING, STATUS_LOCKED
|
| + )
|
|
|
| # import the appropriate module for our platform only
|
| if sys.platform.lower().startswith("linux"):
|
| - from psutil._pslinux import *
|
| - __all__.extend(["cached_phymem", "phymem_buffers"])
|
| + import psutil._pslinux as _psplatform
|
| + from psutil._pslinux import (phymem_buffers,
|
| + cached_phymem,
|
| + IOPRIO_CLASS_NONE,
|
| + IOPRIO_CLASS_RT,
|
| + IOPRIO_CLASS_BE,
|
| + IOPRIO_CLASS_IDLE)
|
| + phymem_buffers = _psplatform.phymem_buffers
|
| + cached_phymem = _psplatform.cached_phymem
|
|
|
| elif sys.platform.lower().startswith("win32"):
|
| - from psutil._psmswindows import *
|
| + import psutil._psmswindows as _psplatform
|
| + from psutil._psmswindows import (ABOVE_NORMAL_PRIORITY_CLASS,
|
| + BELOW_NORMAL_PRIORITY_CLASS,
|
| + HIGH_PRIORITY_CLASS,
|
| + IDLE_PRIORITY_CLASS,
|
| + NORMAL_PRIORITY_CLASS,
|
| + REALTIME_PRIORITY_CLASS)
|
|
|
| elif sys.platform.lower().startswith("darwin"):
|
| - from psutil._psosx import *
|
| + import psutil._psosx as _psplatform
|
|
|
| elif sys.platform.lower().startswith("freebsd"):
|
| - from psutil._psbsd import *
|
| + import psutil._psbsd as _psplatform
|
|
|
| else:
|
| raise NotImplementedError('platform %s is not supported' % sys.platform)
|
|
|
| +__all__.extend(_psplatform.__extra__all__)
|
|
|
| -class CPUTimes:
|
| - """This class contains information about CPU times.
|
| - It is not used directly but it's returned as an instance by
|
| - psutil.cpu_times() function.
|
| +NUM_CPUS = _psplatform.NUM_CPUS
|
| +BOOT_TIME = _psplatform.BOOT_TIME
|
| +TOTAL_PHYMEM = _psplatform.phymem_usage()[0]
|
|
|
| - Every CPU time is accessible in form of an attribute and represents
|
| - the time CPU has spent in the given mode.
|
| -
|
| - The attributes availability varies depending on the platform.
|
| - Here follows a list of all available attributes:
|
| -
|
| - - user
|
| - - system
|
| - - idle
|
| - - nice (UNIX)
|
| - - iowait (Linux)
|
| - - irq (Linux, FreeBSD)
|
| - - softirq (Linux)
|
| - """
|
| -
|
| - def __init__(self, **kwargs):
|
| - self.__attrs = []
|
| - for name in kwargs:
|
| - setattr(self, name, kwargs[name])
|
| - self.__attrs.append(name)
|
| -
|
| - def __str__(self):
|
| - string = []
|
| - for attr in self.__attrs:
|
| - value = getattr(self, attr)
|
| - string.append("%s=%s" %(attr, value))
|
| - return '; '.join(string)
|
| -
|
| - def __iter__(self):
|
| - for attr in self.__attrs:
|
| - yield getattr(self, attr)
|
| +get_pid_list = _psplatform.get_pid_list
|
| +pid_exists = _psplatform.pid_exists
|
|
|
|
|
| class Process(object):
|
| @@ -98,15 +98,16 @@ class Process(object):
|
| def __init__(self, pid):
|
| """Create a new Process object, raises NoSuchProcess if the PID
|
| does not exist, and ValueError if the parameter is not an
|
| - integer PID."""
|
| + integer PID.
|
| + """
|
| if not isinstance(pid, int):
|
| - raise ValueError("An integer is required")
|
| + raise ValueError("an integer is required")
|
| if not pid_exists(pid):
|
| - raise NoSuchProcess(pid, None, "no process found with PID %s" % pid)
|
| + raise NoSuchProcess(pid, None, "no process found with pid %s" % pid)
|
| self._pid = pid
|
| - # platform-specific modules define an PlatformProcess
|
| + # platform-specific modules define an _psplatform.Process
|
| # implementation class
|
| - self._platform_impl = PlatformProcess(pid)
|
| + self._platform_impl = _psplatform.Process(pid)
|
| self._last_sys_cpu_times = None
|
| self._last_proc_cpu_times = None
|
|
|
| @@ -114,30 +115,18 @@ class Process(object):
|
| try:
|
| pid = self.pid
|
| name = repr(self.name)
|
| - cmdline = self.cmdline and repr(' '.join(self.cmdline))
|
| except NoSuchProcess:
|
| details = "(pid=%s (terminated))" % self.pid
|
| except AccessDenied:
|
| details = "(pid=%s)" % (self.pid)
|
| else:
|
| - if cmdline:
|
| - details = "(pid=%s, name=%s, cmdline=%s)" % (pid, name, cmdline)
|
| - else:
|
| - details = "(pid=%s, name=%s)" % (pid, name)
|
| - return "%s.%s %s" % (self.__class__.__module__,
|
| - self.__class__.__name__, details)
|
| + details = "(pid=%s, name=%s)" % (pid, name)
|
| + return "%s.%s%s" % (self.__class__.__module__,
|
| + self.__class__.__name__, details)
|
|
|
| def __repr__(self):
|
| return "<%s at %s>" % (self.__str__(), id(self))
|
|
|
| - def __eq__(self, other):
|
| - """Test for equality with another Process object based on pid
|
| - and creation time.
|
| - """
|
| - h1 = (self.pid, self.create_time)
|
| - h2 = (other.pid, other.create_time)
|
| - return h1 == h2
|
| -
|
| @property
|
| def pid(self):
|
| """The process pid."""
|
| @@ -150,11 +139,15 @@ class Process(object):
|
|
|
| @property
|
| def parent(self):
|
| - """Return the parent process as a Process object. If no ppid is
|
| - known then return None."""
|
| - if self.ppid is not None:
|
| - return Process(self.ppid)
|
| - return None
|
| + """Return the parent process as a Process object. If no parent
|
| + pid is known return None.
|
| + """
|
| + ppid = self.ppid
|
| + if ppid is not None:
|
| + try:
|
| + return Process(ppid)
|
| + except NoSuchProcess:
|
| + pass
|
|
|
| @property
|
| def name(self):
|
| @@ -185,37 +178,63 @@ class Process(object):
|
| _exe = os.path.realpath(cmdline[0])
|
| if os.path.isfile(_exe) and os.access(_exe, os.X_OK):
|
| return _exe
|
| + if not exe:
|
| + raise AccessDenied(self.pid, self._platform_impl._process_name)
|
| return exe
|
|
|
| @property
|
| - def path(self):
|
| - msg = "'path' property is deprecated; use 'os.path.dirname(exe)' instead"
|
| - warnings.warn(msg, DeprecationWarning)
|
| - return os.path.dirname(self.exe)
|
| -
|
| - @property
|
| def cmdline(self):
|
| """The command line process has been called with."""
|
| return self._platform_impl.get_process_cmdline()
|
|
|
| @property
|
| - def uid(self):
|
| - """The real user id of the current process."""
|
| - return self._platform_impl.get_process_uid()
|
| + def status(self):
|
| + """The process current status as a STATUS_* constant."""
|
| + return self._platform_impl.get_process_status()
|
|
|
| @property
|
| - def gid(self):
|
| - """The real group id of the current process."""
|
| - return self._platform_impl.get_process_gid()
|
| + def nice(self):
|
| + """Get or set process niceness (priority)."""
|
| + return self._platform_impl.get_process_nice()
|
| +
|
| + @nice.setter
|
| + def nice(self, value):
|
| + # invoked on "p.nice = num"; change process niceness
|
| + return self._platform_impl.set_process_nice(value)
|
| +
|
| + if os.name == 'posix':
|
| +
|
| + @property
|
| + def uids(self):
|
| + """Return a named tuple denoting the process real,
|
| + effective, and saved user ids.
|
| + """
|
| + return self._platform_impl.get_process_uids()
|
| +
|
| + @property
|
| + def gids(self):
|
| + """Return a named tuple denoting the process real,
|
| + effective, and saved group ids.
|
| + """
|
| + return self._platform_impl.get_process_gids()
|
| +
|
| + @property
|
| + def terminal(self):
|
| + """The terminal associated with this process, if any,
|
| + else None.
|
| + """
|
| + return self._platform_impl.get_process_terminal()
|
|
|
| @property
|
| def username(self):
|
| - """The name of the user that owns the process."""
|
| + """The name of the user that owns the process.
|
| + On UNIX this is calculated by using *real* process uid.
|
| + """
|
| if os.name == 'posix':
|
| if pwd is None:
|
| - # might happen on compiled-from-sources python
|
| + # might happen if python was installed from sources
|
| raise ImportError("requires pwd module shipped with standard python")
|
| - return pwd.getpwuid(self.uid).pw_name
|
| + return pwd.getpwuid(self.uids.real).pw_name
|
| else:
|
| return self._platform_impl.get_process_username()
|
|
|
| @@ -227,17 +246,49 @@ class Process(object):
|
| return self._platform_impl.get_process_create_time()
|
|
|
| # available for Windows and Linux only
|
| - if hasattr(PlatformProcess, "get_process_cwd"):
|
| + if hasattr(_psplatform.Process, "get_process_cwd"):
|
| +
|
| def getcwd(self):
|
| """Return a string representing the process current working
|
| directory.
|
| """
|
| return self._platform_impl.get_process_cwd()
|
|
|
| + # Linux, BSD and Windows only
|
| + if hasattr(_psplatform.Process, "get_process_io_counters"):
|
| +
|
| + def get_io_counters(self):
|
| + """Return process I/O statistics as a namedtuple including
|
| + the number of read/write calls performed and the amount of
|
| + bytes read and written by the process.
|
| + """
|
| + return self._platform_impl.get_process_io_counters()
|
| +
|
| + # available only on Linux
|
| + if hasattr(_psplatform.Process, "get_process_ionice"):
|
| +
|
| + def get_ionice(self):
|
| + """Return process I/O niceness (priority) as a namedtuple."""
|
| + return self._platform_impl.get_process_ionice()
|
| +
|
| + def set_ionice(self, ioclass, value=None):
|
| + """Set process I/O niceness (priority).
|
| + ioclass is one of the IOPRIO_CLASS_* constants.
|
| + iodata is a number which goes from 0 to 7. The higher the
|
| + value, the lower the I/O priority of the process.
|
| + """
|
| + return self._platform_impl.set_process_ionice(ioclass, value)
|
| +
|
| def get_num_threads(self):
|
| """Return the number of threads used by this process."""
|
| return self._platform_impl.get_process_num_threads()
|
|
|
| + def get_threads(self):
|
| + """Return threads opened by process as a list of namedtuples
|
| + including thread id and thread CPU times (user/system).
|
| + """
|
| + return self._platform_impl.get_process_threads()
|
| +
|
| def get_children(self):
|
| """Return the children of this process as a list of Process
|
| objects.
|
| @@ -304,8 +355,7 @@ class Process(object):
|
|
|
| def get_cpu_times(self):
|
| """Return a tuple whose values are process CPU user and system
|
| - time. These are the same first two values that os.times()
|
| - returns for the current process.
|
| + times. The same as os.times() but per-process.
|
| """
|
| return self._platform_impl.get_cpu_times()
|
|
|
| @@ -332,27 +382,34 @@ class Process(object):
|
|
|
| def get_open_files(self):
|
| """Return files opened by process as a list of namedtuples
|
| - including absolute file name and file descriptor.
|
| + including absolute file name and file descriptor number.
|
| """
|
| return self._platform_impl.get_open_files()
|
|
|
| def get_connections(self):
|
| """Return TCP and UPD connections opened by process as a list
|
| - of namedtuple/s.
|
| - For third party processes (!= os.getpid()) results can differ
|
| - depending on user privileges.
|
| + of namedtuples.
|
| + On BSD and OSX results for third party processes (!= os.getpid())
|
| + can differ depending on user privileges.
|
| """
|
| return self._platform_impl.get_connections()
|
|
|
| def is_running(self):
|
| - """Return whether the current process is running in the current
|
| - process list.
|
| - """
|
| + """Return whether this process is running."""
|
| try:
|
| - newproc = Process(self.pid)
|
| - return self == newproc
|
| + # Test for equality with another Process object based
|
| + # on pid and creation time.
|
| + # This pair is supposed to indentify a Process instance
|
| + # univocally over the time (the PID alone is not enough as
|
| + # it might refer to a process which is gone in meantime
|
| + # and its PID reused by another process).
|
| + new_self = Process(self.pid)
|
| + p1 = (self.pid, self.create_time)
|
| + p2 = (new_self.pid, new_self.create_time)
|
| except NoSuchProcess:
|
| return False
|
| + else:
|
| + return p1 == p2
|
|
|
| def send_signal(self, sig):
|
| """Send a signal to process (see signal module constants).
|
| @@ -426,14 +483,66 @@ class Process(object):
|
| else:
|
| self._platform_impl.kill_process()
|
|
|
| + def wait(self, timeout=None):
|
| + """Wait for process to terminate and, if process is a children
|
| + of the current one also return its exit code, else None.
|
| + """
|
| + if timeout is not None and not timeout >= 0:
|
| + raise ValueError("timeout must be a positive integer")
|
| + return self._platform_impl.process_wait(timeout)
|
| +
|
| +
|
| +class Popen(Process):
|
| + """A more convenient interface to stdlib subprocess module.
|
| + It starts a sub process and deals with it exactly as when using
|
| + subprocess.Popen class but in addition also provides all the
|
| + property and methods of psutil.Process class in a unique interface:
|
| +
|
| + >>> import psutil
|
| + >>> from subprocess import PIPE
|
| + >>> p = psutil.Popen(["/usr/bin/python", "-c", "print 'hi'"], stdout=PIPE)
|
| + >>> p.name
|
| + 'python'
|
| + >>> p.uids
|
| + user(real=1000, effective=1000, saved=1000)
|
| + >>> p.username
|
| + 'giampaolo'
|
| + >>> p.communicate()
|
| + ('hi\n', None)
|
| + >>> p.terminate()
|
| + >>> p.wait(timeout=2)
|
| + 0
|
| + >>>
|
| +
|
| + For method names common to both classes such as kill(), terminate()
|
| + and wait(), psutil.Process implementation takes precedence.
|
| +
|
| + For a complete documentation refers to:
|
| + http://docs.python.org/library/subprocess.html
|
| + """
|
| +
|
| + def __init__(self, *args, **kwargs):
|
| + self.__subproc = subprocess.Popen(*args, **kwargs)
|
| + Process.__init__(self, self.__subproc.pid)
|
| +
|
| + def __dir__(self):
|
| + return list(set(dir(Popen) + dir(subprocess.Popen)))
|
| +
|
| + def __getattribute__(self, name):
|
| + try:
|
| + return object.__getattribute__(self, name)
|
| + except AttributeError:
|
| + try:
|
| + return object.__getattribute__(self.__subproc, name)
|
| + except AttributeError:
|
| + raise AttributeError("%s instance has no attribute '%s'"
|
| + %(self.__class__.__name__, name))
|
|
|
| def process_iter():
|
| """Return an iterator yielding a Process class instances for all
|
| running processes on the local machine.
|
| """
|
| pids = get_pid_list()
|
| - # for each PID, create a proxyied Process object
|
| - # it will lazy init it's name and path later if required
|
| for pid in pids:
|
| try:
|
| yield Process(pid)
|
| @@ -446,15 +555,34 @@ def get_process_list():
|
| """
|
| return list(process_iter())
|
|
|
| -def cpu_times():
|
| - """Return system CPU times as a CPUTimes object."""
|
| - values = get_system_cpu_times()
|
| - return CPUTimes(**values)
|
| +def cpu_times(percpu=False):
|
| + """Return system-wide CPU times as a namedtuple object.
|
| + Every CPU time represents the time CPU has spent in the given mode.
|
| + The attributes availability varies depending on the platform.
|
| + Here follows a list of all available attributes:
|
| + - user
|
| + - system
|
| + - idle
|
| + - nice (UNIX)
|
| + - iowait (Linux)
|
| + - irq (Linux, FreeBSD)
|
| + - softirq (Linux)
|
| +
|
| + When percpu is True return a list of nameduples for each CPU.
|
| + First element of the list refers to first CPU, second element
|
| + to second CPU and so on.
|
| + The order of the list is consistent across calls.
|
| + """
|
| + if not percpu:
|
| + return _psplatform.get_system_cpu_times()
|
| + else:
|
| + return _psplatform.get_system_per_cpu_times()
|
|
|
|
|
| _last_cpu_times = cpu_times()
|
| +_last_per_cpu_times = cpu_times(percpu=True)
|
|
|
| -def cpu_percent(interval=0.1):
|
| +def cpu_percent(interval=0.1, percpu=False):
|
| """Return a float representing the current system-wide CPU
|
| utilization as a percentage.
|
|
|
| @@ -465,33 +593,184 @@ def cpu_percent(interval=0.1):
|
| since last call or module import, returning immediately.
|
| In this case is recommended for accuracy that this function be
|
| called with at least 0.1 seconds between calls.
|
| +
|
| + When percpu is True returns a list of floats representing the
|
| + utilization as a percentage for each CPU.
|
| + First element of the list refers to first CPU, second element
|
| + to second CPU and so on.
|
| + The order of the list is consistent across calls.
|
| """
|
| global _last_cpu_times
|
| -
|
| + global _last_per_cpu_times
|
| blocking = interval is not None and interval > 0.0
|
| - if blocking:
|
| - t1 = cpu_times()
|
| - time.sleep(interval)
|
| +
|
| + def calculate(t1, t2):
|
| + t1_all = sum(t1)
|
| + t1_busy = t1_all - t1.idle
|
| +
|
| + t2_all = sum(t2)
|
| + t2_busy = t2_all - t2.idle
|
| +
|
| + # this usually indicates a float precision issue
|
| + if t2_busy <= t1_busy:
|
| + return 0.0
|
| +
|
| + busy_delta = t2_busy - t1_busy
|
| + all_delta = t2_all - t1_all
|
| + busy_perc = (busy_delta / all_delta) * 100
|
| + return round(busy_perc, 1)
|
| +
|
| + # system-wide usage
|
| + if not percpu:
|
| + if blocking:
|
| + t1 = cpu_times()
|
| + time.sleep(interval)
|
| + else:
|
| + t1 = _last_cpu_times
|
| + _last_cpu_times = cpu_times()
|
| + return calculate(t1, _last_cpu_times)
|
| + # per-cpu usage
|
| else:
|
| - t1 = _last_cpu_times
|
| + ret = []
|
| + if blocking:
|
| + tot1 = cpu_times(percpu=True)
|
| + time.sleep(interval)
|
| + else:
|
| + tot1 = _last_per_cpu_times
|
| + _last_per_cpu_times = cpu_times(percpu=True)
|
| + for t1, t2 in zip(tot1, _last_per_cpu_times):
|
| + ret.append(calculate(t1, t2))
|
| + return ret
|
| +
|
| +def phymem_usage():
|
| + """Return the amount of total, used and free physical memory
|
| + on the system in bytes plus the percentage usage.
|
| + """
|
| + return _psplatform.phymem_usage()
|
| +
|
| +def virtmem_usage():
|
| + """Return the amount of total, used and free virtual memory
|
| + on the system in bytes plus the percentage usage.
|
| +
|
| + On Linux they match the values returned by free command line utility.
|
| + On OS X and FreeBSD they represent the same values as returned by
|
| + sysctl vm.vmtotal. On Windows they are determined by reading the
|
| + PageFile values of MEMORYSTATUSEX structure.
|
| + """
|
| + return _psplatform.virtmem_usage()
|
|
|
| - t1_all = sum(t1)
|
| - t1_busy = t1_all - t1.idle
|
| +def disk_usage(path):
|
| + """Return disk usage statistics about the given path as a namedtuple
|
| + including total, used and free space expressed in bytes plus the
|
| + percentage usage.
|
| + """
|
| + return _psplatform.get_disk_usage(path)
|
|
|
| - t2 = cpu_times()
|
| - t2_all = sum(t2)
|
| - t2_busy = t2_all - t2.idle
|
| +def disk_partitions(all=False):
|
| + """Return mounted partitions as a list of namedtuples including
|
| + device, mount point and filesystem type.
|
|
|
| - _last_cpu_times = t1
|
| - # this usually indicates a float precision issue
|
| - if t2_busy <= t1_busy:
|
| - return 0.0
|
| + If "all" parameter is False return physical devices only and ignore
|
| + all others.
|
| + """
|
| + return _psplatform.disk_partitions(all)
|
|
|
| - busy_delta = t2_busy - t1_busy
|
| - all_delta = t2_all - t1_all
|
| - busy_perc = (busy_delta / all_delta) * 100
|
| - return round(busy_perc, 1)
|
| +if hasattr(_psplatform, "network_io_counters"):
|
|
|
| + def network_io_counters(pernic=False):
|
| + """Return network I/O statistics as a namedtuple including:
|
| + - number of bytes sent
|
| + - number of bytes received
|
| + - number of packets sent
|
| + - number of packets received
|
| +
|
| + If pernic is True return the same information for every
|
| + network interface installed on the system as a dictionary
|
| + with network interface names as the keys and the namedtuple
|
| + described above as the values.
|
| + """
|
| + from psutil._common import ntuple_net_iostat
|
| + rawdict = _psplatform.network_io_counters()
|
| + if pernic:
|
| + for nic, fields in rawdict.iteritems():
|
| + rawdict[nic] = ntuple_net_iostat(*fields)
|
| + return rawdict
|
| + else:
|
| + bytes_sent, bytes_recv, packets_sent, packets_recv = 0, 0, 0, 0
|
| + for _, fields in rawdict.iteritems():
|
| + bytes_sent += fields[0]
|
| + bytes_recv += fields[1]
|
| + packets_sent += fields[2]
|
| + packets_recv += fields[3]
|
| + return ntuple_net_iostat(bytes_sent, bytes_recv,
|
| + packets_sent, packets_recv)
|
| +
|
| +if hasattr(_psplatform, "disk_io_counters"):
|
| +
|
| + def disk_io_counters(perdisk=False):
|
| + """Return system disk I/O statistics as a namedtuple including:
|
| + - number of bytes read
|
| + - number of bytes written
|
| + - number of reads
|
| + - number of writes
|
| + - time spent reading from disk (in nanoseconds)
|
| + - time spent writing to disk (in nanoseconds)
|
| +
|
| + If perdisk is True return the same information for every
|
| + physical disk installed on the system as a dictionary
|
| + with partition names as the keys and the namedutuple
|
| + described above as the values.
|
| + """
|
| + from psutil._common import ntuple_disk_iostat
|
| + rawdict = _psplatform.disk_io_counters()
|
| + if perdisk:
|
| + for disk, fields in rawdict.iteritems():
|
| + rawdict[disk] = ntuple_disk_iostat(*fields)
|
| + return rawdict
|
| + else:
|
| + reads, writes, rbytes, wbytes, rtime, wtime = 0, 0, 0, 0, 0, 0
|
| + for _, fields in rawdict.iteritems():
|
| + reads += fields[0]
|
| + writes += fields[1]
|
| + rbytes += fields[2]
|
| + wbytes += fields[3]
|
| + rtime += fields[4]
|
| + wtime += fields[5]
|
| + return ntuple_disk_iostat(reads, writes, rbytes, wbytes, rtime, wtime)
|
| +
|
| +
|
| +def _deprecated(replacement):
|
| + # a decorator which can be used to mark functions as deprecated
|
| + def outer(fun):
|
| + def inner(*args, **kwargs):
|
| + msg = "psutil.%s is deprecated; use %s instead" \
|
| + % (fun.__name__, replacement)
|
| + warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
|
| + return fun(*args, **kwargs)
|
| + return inner
|
| + return outer
|
| +
|
| +# --- deprecated functions
|
| +
|
| +@_deprecated("psutil.phymem_usage")
|
| +def avail_phymem():
|
| + return phymem_usage().free
|
| +
|
| +@_deprecated("psutil.phymem_usage")
|
| +def used_phymem():
|
| + return phymem_usage().used
|
| +
|
| +@_deprecated("psutil.virtmem_usage")
|
| +def total_virtmem():
|
| + return virtmem_usage().total
|
| +
|
| +@_deprecated("psutil.virtmem_usage")
|
| +def used_virtmem():
|
| + return virtmem_usage().used
|
| +
|
| +@_deprecated("psutil.virtmem_usage")
|
| +def avail_virtmem():
|
| + return virtmem_usage().free
|
|
|
| def test():
|
| """List info of all currently running processes emulating a
|
|
|