Changelog
### 5.4.3
```
=====
*2018-01-01*
**Enhancements**
- 775_: disk_partitions() on Windows return mount points.
**Bug fixes**
- 1193_: pids() may return False on OSX.
```
### 5.4.2
```
=====
*2017-12-07*
**Enhancements**
- 1173_: introduced PSUTIL_DEBUG environment variable which can be set in order
to print useful debug messages on stderr (useful in case of nasty errors).
- 1177_: added support for sensors_battery() on OSX. (patch by Arnon Yaari)
- 1183_: Process.children() is 2x faster on UNIX and 2.4x faster on Linux.
- 1188_: deprecated method Process.memory_info_ex() now warns by using
FutureWarning instead of DeprecationWarning.
**Bug fixes**
- 1152_: [Windows] disk_io_counters() may return an empty dict.
- 1169_: [Linux] users() "hostname" returns username instead. (patch by
janderbrain)
- 1172_: [Windows] `make test` does not work.
- 1179_: [Linux] Process.cmdline() is now able to splits cmdline args for
misbehaving processes which overwrite /proc/pid/cmdline and use spaces
instead of null bytes as args separator.
- 1181_: [OSX] Process.memory_maps() may raise ENOENT.
- 1187_: [OSX] pids() does not return PID 0 on recent OSX versions.
```
### 5.4.1
```
=====
*2017-11-08*
**Enhancements**
- 1164_: [AIX] add support for Process.num_ctx_switches(). (patch by Arnon
Yaari)
- 1053_: abandon Python 3.3 support (psutil still works but it's no longer
tested).
**Bug fixes**
- 1150_: [Windows] when a process is terminate()d now the exit code is set to
SIGTERM instead of 0. (patch by Akos Kiss)
- 1151_: python -m psutil.tests fail
- 1154_: [AIX] psutil won't compile on AIX 6.1.0. (patch by Arnon Yaari)
- 1167_: [Windows] net_io_counter() packets count now include also non-unicast
packets. (patch by Matthew Long)
```
### 5.4.0
```
=====
*2017-10-12*
**Enhancements**
- 1123_: [AIX] added support for AIX platform. (patch by Arnon Yaari)
**Bug fixes**
- 1009_: [Linux] sensors_temperatures() may crash with IOError.
- 1012_: [Windows] disk_io_counters()'s read_time and write_time were expressed
in tens of micro seconds instead of milliseconds.
- 1127_: [OSX] invalid reference counting in Process.open_files() may lead to
segfault. (patch by Jakub Bacic)
- 1129_: [Linux] sensors_fans() may crash with IOError. (patch by Sebastian
Saip)
- 1131_: [SunOS] fix compilation warnings. (patch by Arnon Yaari)
- 1133_: [Windows] can't compile on newer versions of Visual Studio 2017 15.4.
(patch by Max Bélanger)
- 1138_: [Linux] can't compile on CentOS 5.0 and RedHat 5.0.
(patch by Prodesire)
```
### 5.3.1
```
=====
*2017-09-10*
**Enhancements**
- 1124_: documentation moved to http://psutil.readthedocs.io
**Bug fixes**
- 1105_: [FreeBSD] psutil does not compile on FreeBSD 12.
- 1125_: [BSD] net_connections() raises TypeError.
**Compatibility notes**
- 1120_: .exe files for Windows are no longer uploaded on PYPI as per PEP-527;
only wheels are provided.
```
### 5.3.0
```
=====
*2017-09-01*
**Enhancements**
- 802_: disk_io_counters() and net_io_counters() numbers no longer wrap
(restart from 0). Introduced a new "nowrap" argument.
- 928_: psutil.net_connections() and psutil.Process.connections() "laddr" and
"raddr" are now named tuples.
- 1015_: swap_memory() now relies on /proc/meminfo instead of sysinfo() syscall
so that it can be used in conjunction with PROCFS_PATH in order to retrieve
memory info about Linux containers such as Docker and Heroku.
- 1022_: psutil.users() provides a new "pid" field.
- 1025_: process_iter() accepts two new parameters in order to invoke
Process.as_dict(): "attrs" and "ad_value". With this you can iterate over all
processes in one shot without needing to catch NoSuchProcess and do list/dict
comprehensions.
- 1040_: implemented full unicode support.
- 1051_: disk_usage() on Python 3 is now able to accept bytes.
- 1058_: test suite now enables all warnings by default.
- 1060_: source distribution is dynamically generated so that it only includes
relevant files.
- 1079_: [FreeBSD] net_connections()'s fd number is now being set for real
(instead of -1). (patch by Gleb Smirnoff)
- 1091_: [SunOS] implemented Process.environ(). (patch by Oleksii Shevchuk)
**Bug fixes**
- 989_: [Windows] boot_time() may return a negative value.
- 1007_: [Windows] boot_time() can have a 1 sec fluctuation between calls; the
value of the first call is now cached so that boot_time() always returns the
same value if fluctuation is <= 1 second.
- 1013_: [FreeBSD] psutil.net_connections() may return incorrect PID. (patch
by Gleb Smirnoff)
- 1014_: [Linux] Process class can mask legitimate ENOENT exceptions as
NoSuchProcess.
- 1016_: disk_io_counters() raises RuntimeError on a system with no disks.
- 1017_: net_io_counters() raises RuntimeError on a system with no network
cards installed.
- 1021_: [Linux] open_files() may erroneously raise NoSuchProcess instead of
skipping a file which gets deleted while open files are retrieved.
- 1029_: [OSX, FreeBSD] Process.connections('unix') on Python 3 doesn't
properly handle unicode paths and may raise UnicodeDecodeError.
- 1033_: [OSX, FreeBSD] memory leak for net_connections() and
Process.connections() when retrieving UNIX sockets (kind='unix').
- 1040_: fixed many unicode related issues such as UnicodeDecodeError on
Python 3 + UNIX and invalid encoded data on Windows.
- 1042_: [FreeBSD] psutil won't compile on FreeBSD 12.
- 1044_: [OSX] different Process methods incorrectly raise AccessDenied for
zombie processes.
- 1046_: [Windows] disk_partitions() on Windows overrides user's SetErrorMode.
- 1047_: [Windows] Process username(): memory leak in case exception is thrown.
- 1048_: [Windows] users()'s host field report an invalid IP address.
- 1050_: [Windows] Process.memory_maps memory() leaks memory.
- 1055_: cpu_count() is no longer cached; this is useful on systems such as
Linux where CPUs can be disabled at runtime. This also reflects on
Process.cpu_percent() which no longer uses the cache.
- 1058_: fixed Python warnings.
- 1062_: disk_io_counters() and net_io_counters() raise TypeError if no disks
or NICs are installed on the system.
- 1063_: [NetBSD] net_connections() may list incorrect sockets.
- 1064_: [NetBSD] swap_memory() may segfault in case of error.
- 1065_: [OpenBSD] Process.cmdline() may raise SystemError.
- 1067_: [NetBSD] Process.cmdline() leaks memory if process has terminated.
- 1069_: [FreeBSD] Process.cpu_num() may return 255 for certain kernel
processes.
- 1071_: [Linux] cpu_freq() may raise IOError on old RedHat distros.
- 1074_: [FreeBSD] sensors_battery() raises OSError in case of no battery.
- 1075_: [Windows] net_if_addrs(): inet_ntop() return value is not checked.
- 1077_: [SunOS] net_if_addrs() shows garbage addresses on SunOS 5.10.
(patch by Oleksii Shevchuk)
- 1077_: [SunOS] net_connections() does not work on SunOS 5.10. (patch by
Oleksii Shevchuk)
- 1079_: [FreeBSD] net_connections() didn't list locally connected sockets.
(patch by Gleb Smirnoff)
- 1085_: cpu_count() return value is now checked and forced to None if <= 1.
- 1087_: Process.cpu_percent() guard against cpu_count() returning None and
assumes 1 instead.
- 1093_: [SunOS] memory_maps() shows wrong 64 bit addresses.
- 1094_: [Windows] psutil.pid_exists() may lie. Also, all process APIs relying
on OpenProcess Windows API now check whether the PID is actually running.
- 1098_: [Windows] Process.wait() may erroneously return sooner, when the PID
is still alive.
- 1099_: [Windows] Process.terminate() may raise AccessDenied even if the
process already died.
- 1101_: [Linux] sensors_temperatures() may raise ENODEV.
**Porting notes**
- 1039_: returned types consolidation:
- Windows / Process.cpu_times(): fields 3 and 4 were int instead of float
- Linux / FreeBSD: connections('unix'): raddr is now set to "" instead of
None
- OpenBSD: connections('unix'): laddr and raddr are now set to "" instead of
None
- 1040_: all strings are encoded by using OS fs encoding.
- 1040_: the following Windows APIs on Python 2 now return a string instead of
unicode:
- Process.memory_maps().path
- WindowsService.bin_path()
- WindowsService.description()
- WindowsService.display_name()
- WindowsService.username()
```
### 5.2.2
```
=====
*2017-04-10*
**Bug fixes**
- 1000_: fixed some setup.py warnings.
- 1002_: [SunOS] remove C macro which will not be available on new Solaris
versions. (patch by Danek Duvall)
- 1004_: [Linux] Process.io_counters() may raise ValueError.
- 1006_: [Linux] cpu_freq() may return None on some Linux versions does not
support the function; now the function is not declared instead.
- 1009_: [Linux] sensors_temperatures() may raise OSError.
- 1010_: [Linux] virtual_memory() may raise ValueError on Ubuntu 14.04.
```
### 5.2.1
```
=====
*2017-03-24*
**Bug fixes**
- 981_: [Linux] cpu_freq() may return an empty list.
- 993_: [Windows] Process.memory_maps() on Python 3 may raise
UnicodeDecodeError.
- 996_: [Linux] sensors_temperatures() may not show all temperatures.
- 997_: [FreeBSD] virtual_memory() may fail due to missing sysctl parameter on
FreeBSD 12.
```
### 5.2.0
```
=====
*2017-03-05*
**Enhancements**
- 971_: [Linux] Add psutil.sensors_fans() function. (patch by Nicolas Hennion)
- 976_: [Windows] Process.io_counters() has 2 new fields: *other_count* and
*other_bytes*.
- 976_: [Linux] Process.io_counters() has 2 new fields: *read_chars* and
*write_chars*.
**Bug fixes**
- 872_: [Linux] can now compile on Linux by using MUSL C library.
- 985_: [Windows] Fix a crash in `Process.open_files` when the worker thread for `NtQueryObject` times out.
- 986_: [Linux] Process.cwd() may raise NoSuchProcess instead of ZombieProcess.
```
### 5.1.3
```
=====
**Bug fixes**
- 971_: [Linux] sensors_temperatures() didn't work on CentOS 7.
- 973_: cpu_percent() may raise ZeroDivisionError.
```
### 5.1.2
```
=====
*2017-02-03*
**Bug fixes**
- 966_: [Linux] sensors_battery().power_plugged may erroneously return None on
Python 3.
- 968_: [Linux] disk_io_counters() raises TypeError on python 3.
- 970_: [Linux] sensors_battery()'s name and label fields on Python 3 are bytes
instead of str.
```
### 5.1.1
```
=====
*2017-02-03*
**Enhancements**
- 966_: [Linux] sensors_battery().percent is a float and is more precise.
**Bug fixes**
- 964_: [Windows] Process.username() and psutil.users() may return badly
decoding character on Python 3.
- 965_: [Linux] disk_io_counters() may miscalculate sector size and report the
wrong number of bytes read and written.
- 966_: [Linux] sensors_battery() may fail with "no such file error".
- 966_: [Linux] sensors_battery().power_plugged may lie.
```
### 5.1.0
```
=====
*2017-02-01*
**Enhancements**
- 357_: added psutil.Process.cpu_num() (what CPU a process is on).
- 371_: added psutil.sensors_temperatures() (Linux only).
- 941_: added psutil.cpu_freq() (CPU frequency).
- 955_: added psutil.sensors_battery() (Linux, Windows, only).
- 956_: cpu_affinity([]) can now be used as an alias to set affinity against
all eligible CPUs.
**Bug fixes**
- 687_: [Linux] pid_exists() no longer returns True if passed a process thread
ID.
- 948_: cannot install psutil with PYTHONOPTIMIZE=2.
- 950_: [Windows] Process.cpu_percent() was calculated incorrectly and showed
higher number than real usage.
- 951_: [Windows] the uploaded wheels for Python 3.6 64 bit didn't work.
- 959_: psutil exception objects could not be pickled.
- 960_: Popen.wait() did not return the correct negative exit status if process
is ``kill()``ed by a signal.
- 961_: [Windows] WindowsService.description() may fail with
ERROR_MUI_FILE_NOT_FOUND.
```
### 5.0.1
```
=====
*2016-12-21*
**Enhancements**
- 939_: tar.gz distribution went from 1.8M to 258K.
- 811_: [Windows] provide a more meaningful error message if trying to use
psutil on unsupported Windows XP.
**Bug fixes**
- 609_: [SunOS] psutil does not compile on Solaris 10.
- 936_: [Windows] fix compilation error on VS 2013 (patch by Max Bélanger).
- 940_: [Linux] cpu_percent() and cpu_times_percent() was calculated
incorrectly as "iowait", "guest" and "guest_nice" times were not properly
taken into account.
- 944_: [OpenBSD] psutil.pids() was omitting PID 0.
```
### 5.0.0
```
=====
*2016-11-06*
**Enhncements**
- 799_: new Process.oneshot() context manager making Process methods around
+2x faster in general and from +2x to +6x faster on Windows.
- 943_: better error message in case of version conflict on import.
**Bug fixes**
- 932_: [NetBSD] net_connections() and Process.connections() may fail without
raising an exception.
- 933_: [Windows] memory leak in cpu_stats() and WindowsService.description().
```
### 4.4.2
```
=====
*2016-10-26*
**Bug fixes**
- 931_: psutil no longer compiles on Solaris.
```
### 4.4.1
```
=====
*2016-10-25*
**Bug fixes**
- 927_: ``Popen.__del__`` may cause maximum recursion depth error.
```
### 4.4.0
```
=====
*2016-10-23*
**Enhancements**
- 874_: [Windows] net_if_addrs() returns also the netmask.
- 887_: [Linux] virtual_memory()'s 'available' and 'used' values are more
precise and match "free" cmdline utility. "available" also takes into
account LCX containers preventing "available" to overflow "total".
- 891_: procinfo.py script has been updated and provides a lot more info.
**Bug fixes**
- 514_: [OSX] possibly fix Process.memory_maps() segfault (critical!).
- 783_: [OSX] Process.status() may erroneously return "running" for zombie
processes.
- 798_: [Windows] Process.open_files() returns and empty list on Windows 10.
- 825_: [Linux] cpu_affinity; fix possible double close and use of unopened
socket.
- 880_: [Windows] Handle race condition inside psutil_net_connections.
- 885_: ValueError is raised if a negative integer is passed to cpu_percent()
functions.
- 892_: [Linux] Process.cpu_affinity([-1]) raise SystemError with no error
set; now ValueError is raised.
- 906_: [BSD] disk_partitions(all=False) returned an empty list. Now the
argument is ignored and all partitions are always returned.
- 907_: [FreeBSD] Process.exe() may fail with OSError(ENOENT).
- 908_: [OSX, BSD] different process methods could errounesuly mask the real
error for high-privileged PIDs and raise NoSuchProcess and AccessDenied
instead of OSError and RuntimeError.
- 909_: [OSX] Process open_files() and connections() methods may raise
OSError with no exception set if process is gone.
- 916_: [OSX] fix many compilation warnings.
```
### 4.3.1
```
=====
*2016-09-01*
**Enhancements**
- 881_: "make install" now works also when using a virtual env.
**Bug fixes**
- 854_: Process.as_dict() raises ValueError if passed an erroneous attrs name.
- 857_: [SunOS] Process cpu_times(), cpu_percent(), threads() amd memory_maps()
may raise RuntimeError if attempting to query a 64bit process with a 32bit
python. "Null" values are returned as a fallback.
- 858_: Process.as_dict() should not return memory_info_ex() because it's
deprecated.
- 863_: [Windows] memory_map truncates addresses above 32 bits
- 866_: [Windows] win_service_iter() and services in general are not able to
handle unicode service names / descriptions.
- 869_: [Windows] Process.wait() may raise TimeoutExpired with wrong timeout
unit (ms instead of sec).
- 870_: [Windows] Handle leak inside psutil_get_process_data.
```
### 4.3.0
```
=====
*2016-06-18*
**Enhancements**
- 819_: [Linux] different speedup improvements:
Process.ppid() is 20% faster
Process.status() is 28% faster
Process.name() is 25% faster
Process.num_threads is 20% faster on Python 3
**Bug fixes**
- 810_: [Windows] Windows wheels are incompatible with pip 7.1.2.
- 812_: [NetBSD] fix compilation on NetBSD-5.x.
- 823_: [NetBSD] virtual_memory() raises TypeError on Python 3.
- 829_: [UNIX] psutil.disk_usage() percent field takes root reserved space
into account.
- 816_: [Windows] fixed net_io_counter() values wrapping after 4.3GB in
Windows Vista (NT 6.0) and above using 64bit values from newer win APIs.
```
### 4.2.0
```
=====
*2016-05-14*
**Enhancements**
- 795_: [Windows] new APIs to deal with Windows services: win_service_iter()
and win_service_get().
- 800_: [Linux] psutil.virtual_memory() returns a new "shared" memory field.
- 819_: [Linux] speedup /proc parsing:
- Process.ppid() is 20% faster
- Process.status() is 28% faster
- Process.name() is 25% faster
- Process.num_threads is 20% faster on Python 3
**Bug fixes**
- 797_: [Linux] net_if_stats() may raise OSError for certain NIC cards.
- 813_: Process.as_dict() should ignore extraneous attribute names which gets
attached to the Process instance.
```
### 4.1.0
```
=====
*2016-03-12*
**Enhancements**
- 777_: [Linux] Process.open_files() on Linux return 3 new fields: position,
mode and flags.
- 779_: Process.cpu_times() returns two new fields, 'children_user' and
'children_system' (always set to 0 on OSX and Windows).
- 789_: [Windows] psutil.cpu_times() return two new fields: "interrupt" and
"dpc". Same for psutil.cpu_times_percent().
- 792_: new psutil.cpu_stats() function returning number of CPU ctx switches
interrupts, soft interrupts and syscalls.
**Bug fixes**
- 774_: [FreeBSD] net_io_counters() dropout is no longer set to 0 if the kernel
provides it.
- 776_: [Linux] Process.cpu_affinity() may erroneously raise NoSuchProcess.
(patch by wxwright)
- 780_: [OSX] psutil does not compile with some gcc versions.
- 786_: net_if_addrs() may report incomplete MAC addresses.
- 788_: [NetBSD] virtual_memory()'s buffers and shared values were set to 0.
- 790_: [OSX] psutil won't compile on OSX 10.4.
```
### 4.0.0
```
=====
*2016-02-17*
**Enhancements**
- 523_: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field.
- 660_: [Windows] make.bat is smarter in finding alternative VS install
locations. (patch by mpderbec)
- 732_: Process.environ(). (patch by Frank Benkstein)
- 753_: [Linux, OSX, Windows] Process USS and PSS (Linux) "real" memory stats.
(patch by Eric Rahm)
- 755_: Process.memory_percent() "memtype" parameter.
- 758_: tests now live in psutil namespace.
- 760_: expose OS constants (psutil.LINUX, psutil.OSX, etc.)
- 756_: [Linux] disk_io_counters() return 2 new fields: read_merged_count and
write_merged_count.
- 762_: new scripts/procsmem.py script.
**Bug fixes**
- 685_: [Linux] virtual_memory() provides wrong results on systems with a lot
of physical memory.
- 704_: [Solaris] psutil does not compile on Solaris sparc.
- 734_: on Python 3 invalid UTF-8 data is not correctly handled for process
name(), cwd(), exe(), cmdline() and open_files() methods resulting in
UnicodeDecodeError exceptions. 'surrogateescape' error handler is now
used as a workaround for replacing the corrupted data.
- 737_: [Windows] when the bitness of psutil and the target process was
different cmdline() and cwd() could return a wrong result or incorrectly
report an AccessDenied error.
- 741_: [OpenBSD] psutil does not compile on mips64.
- 751_: [Linux] fixed call to Py_DECREF on possible Null object.
- 754_: [Linux] cmdline() can be wrong in case of zombie process.
- 759_: [Linux] Process.memory_maps() may return paths ending with " (deleted)"
- 761_: [Windows] psutil.boot_time() wraps to 0 after 49 days.
- 764_: [NetBSD] fix compilation on NetBSD-6.x.
- 766_: [Linux] net_connections() can't handle malformed /proc/net/unix file.
- 767_: [Linux] disk_io_counters() may raise ValueError on 2.6 kernels and it's
broken on 2.4 kernels.
- 770_: [NetBSD] disk_io_counters() metrics didn't update.
```
### 3.4.2
```
=====
*2016-01-20*
**Enhancements**
- 728_: [Solaris] exposed psutil.PROCFS_PATH constant to change the default
location of /proc filesystem.
**Bug fixes**
- 724_: [FreeBSD] psutil.virtual_memory().total is incorrect.
- 730_: [FreeBSD] psutil.virtual_memory() crashes.
```
### 3.4.1
```
=====
*2016-01-15*
**Enhancements**
- 557_: [NetBSD] added NetBSD support. (contributed by Ryo Onodera and
Thomas Klausner)
- 708_: [Linux] psutil.net_connections() and Process.connections() on Python 2
can be up to 3x faster in case of many connections.
Also psutil.Process.memory_maps() is slightly faster.
- 718_: process_iter() is now thread safe.
**Bug fixes**
- 714_: [OpenBSD] virtual_memory().cached value was always set to 0.
- 715_: don't crash at import time if cpu_times() fail for some reason.
- 717_: [Linux] Process.open_files fails if deleted files still visible.
- 722_: [Linux] swap_memory() no longer crashes if sin/sout can't be determined
due to missing /proc/vmstat.
- 724_: [FreeBSD] virtual_memory().total is slightly incorrect.
```
### 3.3.0
```
=====
*2015-11-25*
**Enhancements**
- 558_: [Linux] exposed psutil.PROCFS_PATH constant to change the default
location of /proc filesystem.
- 615_: [OpenBSD] added OpenBSD support. (contributed by Landry Breuil)
**Bug fixes**
- 692_: [UNIX] Process.name() is no longer cached as it may change.
```
### 3.2.2
```
=====
*2015-10-04*
**Bug fixes**
- 517_: [SunOS] net_io_counters failed to detect network interfaces
correctly on Solaris 10
- 541_: [FreeBSD] disk_io_counters r/w times were expressed in seconds instead
of milliseconds. (patch by dasumin)
- 610_: [SunOS] fix build and tests on Solaris 10
- 623_: [Linux] process or system connections raises ValueError if IPv6 is not
supported by the system.
- 678_: [Linux] can't install psutil due to bug in setup.py.
- 688_: [Windows] compilation fails with MSVC 2015, Python 3.5. (patch by
Mike Sarahan)
```
### 3.2.1
```
=====
*2015-09-03*
**Bug fixes**
- 677_: [Linux] can't install psutil due to bug in setup.py.
```
### 3.2.0
```
=====
*2015-09-02*
**Enhancements**
- 644_: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals
to use with Process.send_signal().
- 648_: CI test integration for OSX. (patch by Jeff Tang)
- 663_: [UNIX] net_if_addrs() now returns point-to-point (VPNs) addresses.
- 655_: [Windows] different issues regarding unicode handling were fixed. On
Python 2 all APIs returning a string will now return an encoded version of it
by using sys.getfilesystemencoding() codec. The APIs involved are:
- psutil.net_if_addrs()
- psutil.net_if_stats()
- psutil.net_io_counters()
- psutil.Process.cmdline()
- psutil.Process.name()
- psutil.Process.username()
- psutil.users()
**Bug fixes**
- 513_: [Linux] fixed integer overflow for RLIM_INFINITY.
- 641_: [Windows] fixed many compilation warnings. (patch by Jeff Tang)
- 652_: [Windows] net_if_addrs() UnicodeDecodeError in case of non-ASCII NIC
names.
- 655_: [Windows] net_if_stats() UnicodeDecodeError in case of non-ASCII NIC
names.
- 659_: [Linux] compilation error on Suse 10. (patch by maozguttman)
- 664_: [Linux] compilation error on Alpine Linux. (patch by Bart van Kleef)
- 670_: [Windows] segfgault of net_if_addrs() in case of non-ASCII NIC names.
(patch by sk6249)
- 672_: [Windows] compilation fails if using Windows SDK v8.0. (patch by
Steven Winfield)
- 675_: [Linux] net_connections(); UnicodeDecodeError may occur when listing
UNIX sockets.
```
### 3.1.1
```
=====
*2015-07-15*
**Bug fixes**
- 603_: [Linux] ionice_set value range is incorrect. (patch by spacewander)
- 645_: [Linux] psutil.cpu_times_percent() may produce negative results.
- 656_: 'from psutil import *' does not work.
```
### 3.1.0
```
=====
*2015-07-15*
**Enhancements**
- 534_: [Linux] disk_partitions() added support for ZFS filesystems.
- 646_: continuous tests integration for Windows with
https://ci.appveyor.com/project/giampaolo/psutil.
- 647_: new dev guide:
https://github.com/giampaolo/psutil/blob/master/DEVGUIDE.rst
- 651_: continuous code quality test integration with scrutinizer-ci.com
**Bug fixes**
- 340_: [Windows] Process.open_files() no longer hangs. Instead it uses a
thred which times out and skips the file handle in case it's taking too long
to be retrieved. (patch by Jeff Tang, PR 597)
- 627_: [Windows] Process.name() no longer raises AccessDenied for pids owned
by another user.
- 636_: [Windows] Process.memory_info() raise AccessDenied.
- 637_: [UNIX] raise exception if trying to send signal to Process PID 0 as it
will affect os.getpid()'s process group instead of PID 0.
- 639_: [Linux] Process.cmdline() can be truncated.
- 640_: [Linux] *connections functions may swallow errors and return an
incomplete list of connnections.
- 642_: repr() of exceptions is incorrect.
- 653_: [Windows] Add inet_ntop function for Windows XP to support IPv6.
- 641_: [Windows] Replace deprecated string functions with safe equivalents.
```
### 3.0.1
```
=====
*2015-06-18*
**Bug fixes**
- 632_: [Linux] better error message if cannot parse process UNIX connections.
- 634_: [Linux] Proces.cmdline() does not include empty string arguments.
- 635_: [UNIX] crash on module import if 'enum' package is installed on python
< 3.4.
```
### 3.0.0
```
=====
*2015-06-13*
**Enhancements**
- 250_: new psutil.net_if_stats() returning NIC statistics (isup, duplex,
speed, MTU).
- 376_: new psutil.net_if_addrs() returning all NIC addresses a-la ifconfig.
- 469_: on Python >= 3.4 ``IOPRIO_CLASS_*`` and ``*_PRIORITY_CLASS`` constants
returned by psutil.Process' ionice() and nice() methods are enums instead of
plain integers.
- 581_: add .gitignore. (patch by Gabi Davar)
- 582_: connection constants returned by psutil.net_connections() and
psutil.Process.connections() were turned from int to enums on Python > 3.4.
- 587_: Move native extension into the package.
- 589_: Process.cpu_affinity() accepts any kind of iterable (set, tuple, ...),
not only lists.
- 594_: all deprecated APIs were removed.
- 599_: [Windows] process name() can now be determined for all processes even
when running as a limited user.
- 602_: pre-commit GIT hook.
- 629_: enhanced support for py.test and nose test discovery and tests run.
- 616_: [Windows] Add inet_ntop function for Windows XP.
**Bug fixes**
- 428_: [all UNIXes except Linux] correct handling of zombie processes;
introduced new ZombieProcess exception class.
- 512_: [BSD] fix segfault in net_connections().
- 555_: [Linux] psutil.users() correctly handles ":0" as an alias for
"localhost"
- 579_: [Windows] Fixed open_files() for PID>64K.
- 579_: [Windows] fixed many compiler warnings.
- 585_: [FreeBSD] net_connections() may raise KeyError.
- 586_: [FreeBSD] cpu_affinity() segfaults on set in case an invalid CPU
number is provided.
- 593_: [FreeBSD] Process().memory_maps() segfaults.
- 606_: Process.parent() may swallow NoSuchProcess exceptions.
- 611_: [SunOS] net_io_counters has send and received swapped
- 614_: [Linux]: cpu_count(logical=False) return the number of physical CPUs
instead of physical cores.
- 618_: [SunOS] swap tests fail on Solaris when run as normal user
- 628_: [Linux] Process.name() truncates process name in case it contains
spaces or parentheses.
```
### 2.2.1
```
=====
*2015-02-02*
**Bug fixes**
- 496_: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references"
(patch by Bruno Binet)
```
### 2.2.0
```
=====
*2015-01-06*
**Enhancements**
- 521_: drop support for Python 2.4 and 2.5.
- 553_: new examples/pstree.py script.
- 564_: C extension version mismatch in case the user messed up with psutil
installation or with sys.path is now detected at import time.
- 568_: New examples/pidof.py script.
- 569_: [FreeBSD] add support for process CPU affinity.
**Bug fixes**
- 496_: [Solaris] can't import psutil.
- 547_: [UNIX] Process.username() may raise KeyError if UID can't be resolved.
- 551_: [Windows] get rid of the unicode hack for net_io_counters() NIC names.
- 556_: [Linux] lots of file handles were left open.
- 561_: [Linux] net_connections() might skip some legitimate UNIX sockets.
(patch by spacewander)
- 565_: [Windows] use proper encoding for psutil.Process.username() and
psutil.users(). (patch by Sylvain Mouquet)
- 567_: [Linux] in the alternative implementation of CPU affinity PyList_Append
and Py_BuildValue return values are not checked.
- 569_: [FreeBSD] fix memory leak in psutil.cpu_count(logical=False).
- 571_: [Linux] Process.open_files() might swallow AccessDenied exceptions and
return an incomplete list of open files.
```
### 2.1.3
```
=====
*2014-09-26*
- 536_: [Linux]: fix "undefined symbol: CPU_ALLOC" compilation error.
```
### 2.1.2
```
=====
*2014-09-21*
**Enhancements**
- 407_: project moved from Google Code to Github; code moved from Mercurial
to Git.
- 492_: use tox to run tests on multiple python versions. (patch by msabramo)
- 505_: [Windows] distribution as wheel packages.
- 511_: new examples/ps.py sample code.
**Bug fixes**
- 340_: [Windows] Process.get_open_files() no longer hangs. (patch by
Jeff Tang)
- 501_: [Windows] disk_io_counters() may return negative values.
- 503_: [Linux] in rare conditions Process exe(), open_files() and
connections() methods can raise OSError(ESRCH) instead of NoSuchProcess.
- 504_: [Linux] can't build RPM packages via setup.py
- 506_: [Linux] python 2.4 support was broken.
- 522_: [Linux] Process.cpu_affinity() might return EINVAL. (patch by David
Daeschler)
- 529_: [Windows] Process.exe() may raise unhandled WindowsError exception
for PIDs 0 and 4. (patch by Jeff Tang)
- 530_: [Linux] psutil.disk_io_counters() may crash on old Linux distros
(< 2.6.5) (patch by Yaolong Huang)
- 533_: [Linux] Process.memory_maps() may raise TypeError on old Linux distros.
```
### 2.1.1
```
=====
*2014-04-30*
**Bug fixes**
- 446_: [Windows] fix encoding error when using net_io_counters() on Python 3.
(patch by Szigeti Gabor Niif)
- 460_: [Windows] net_io_counters() wraps after 4G.
- 491_: [Linux] psutil.net_connections() exceptions. (patch by Alexander Grothe)
```
### 2.1.0
```
=====
*2014-04-08*
**Enhancements**
- 387_: system-wide open connections a-la netstat.
**Bug fixes**
- 421_: [Solaris] psutil does not compile on SunOS 5.10 (patch by Naveed
Roudsari)
- 489_: [Linux] psutil.disk_partitions() return an empty list.
```
### 2.0.0
```
=====
*2014-03-10*
**Enhancements**
- 424_: [Windows] installer for Python 3.X 64 bit.
- 427_: number of logical and physical CPUs (psutil.cpu_count()).
- 447_: psutil.wait_procs() timeout parameter is now optional.
- 452_: make Process instances hashable and usable with set()s.
- 453_: tests on Python < 2.7 require unittest2 module.
- 459_: add a make file for running tests and other repetitive tasks (also
on Windows).
- 463_: make timeout parameter of cpu_percent* functions default to 0.0 'cause
it's a common trap to introduce slowdowns.
- 468_: move documentation to readthedocs.com.
- 477_: process cpu_percent() is about 30% faster. (suggested by crusaderky)
- 478_: [Linux] almost all APIs are about 30% faster on Python 3.X.
- 479_: long deprecated psutil.error module is gone; exception classes now
live in "psutil" namespace only.
**Bug fixes**
- 193_: psutil.Popen constructor can throw an exception if the spawned process
terminates quickly.
- 340_: [Windows] process get_open_files() no longer hangs. (patch by
jtangvahna.net)
- 443_: [Linux] fix a potential overflow issue for Process.set_cpu_affinity()
on systems with more than 64 CPUs.
- 448_: [Windows] get_children() and ppid() memory leak (patch by Ulrich
Klank).
- 457_: [POSIX] pid_exists() always returns True for PID 0.
- 461_: namedtuples are not pickle-able.
- 466_: [Linux] process exe improper null bytes handling. (patch by
Gautam Singh)
- 470_: wait_procs() might not wait. (patch by crusaderky)
- 471_: [Windows] process exe improper unicode handling. (patch by
alexmroja.net)
- 473_: psutil.Popen.wait() does not set returncode attribute.
- 474_: [Windows] Process.cpu_percent() is no longer capped at 100%.
- 476_: [Linux] encoding error for process name and cmdline.
**API changes**
For the sake of consistency a lot of psutil APIs have been renamed.
In most cases accessing the old names will work but it will cause a
DeprecationWarning.
- psutil.* module level constants have being replaced by functions:
+-----------------------+-------------------------------+
| Old name | Replacement |
+=======================+===============================+
| psutil.NUM_CPUS | psutil.cpu_cpunt() |
+-----------------------+-------------------------------+
| psutil.BOOT_TIME | psutil.boot_time() |
+-----------------------+-------------------------------+
| psutil.TOTAL_PHYMEM | psutil.virtual_memory().total |
+-----------------------+-------------------------------+
- Renamed psutil.* functions:
+--------------------------+-------------------------------+
| Old name | Replacement |
+==========================+===============================+
| - psutil.get_pid_list() | psutil.pids() |
+--------------------------+-------------------------------+
| - psutil.get_users() | psutil.users() |
+--------------------------+-------------------------------+
| - psutil.get_boot_time() | psutil.boot_time() |
+--------------------------+-------------------------------+
- All psutil.Process ``get_*`` methods lost the ``get_`` prefix.
get_ext_memory_info() renamed to memory_info_ex().
Assuming "p = psutil.Process()":
+--------------------------+----------------------+
| Old name | Replacement |
+==========================+======================+
| p.get_children() | p.children() |
+--------------------------+----------------------+
| p.get_connections() | p.connections() |
+--------------------------+----------------------+
| p.get_cpu_affinity() | p.cpu_affinity() |
+--------------------------+----------------------+
| p.get_cpu_percent() | p.cpu_percent() |
+--------------------------+----------------------+
| p.get_cpu_times() | p.cpu_times() |
+--------------------------+----------------------+
| p.get_ext_memory_info() | p.memory_info_ex() |
+--------------------------+----------------------+
| p.get_io_counters() | p.io_counters() |
+--------------------------+----------------------+
| p.get_ionice() | p.ionice() |
+--------------------------+----------------------+
| p.get_memory_info() | p.memory_info() |
+--------------------------+----------------------+
| p.get_memory_maps() | p.memory_maps() |
+--------------------------+----------------------+
| p.get_memory_percent() | p.memory_percent() |
+--------------------------+----------------------+
| p.get_nice() | p.nice() |
+--------------------------+----------------------+
| p.get_num_ctx_switches() | p.num_ctx_switches() |
+--------------------------+----------------------+
| p.get_num_fds() | p.num_fds() |
+--------------------------+----------------------+
| p.get_num_threads() | p.num_threads() |
+--------------------------+----------------------+
| p.get_open_files() | p.open_files() |
+--------------------------+----------------------+
| p.get_rlimit() | p.rlimit() |
+--------------------------+----------------------+
| p.get_threads() | p.threads() |
+--------------------------+----------------------+
| p.getcwd() | p.cwd() |
+--------------------------+----------------------+
- All psutil.Process ``set_*`` methods lost the ``set_`` prefix.
Assuming "p = psutil.Process()":
+----------------------+---------------------------------+
| Old name | Replacement |
+======================+=================================+
| p.set_nice() | p.nice(value) |
+----------------------+---------------------------------+
| p.set_ionice() | p.ionice(ioclass, value=None) |
+----------------------+---------------------------------+
| p.set_cpu_affinity() | p.cpu_affinity(cpus) |
+----------------------+---------------------------------+
| p.set_rlimit() | p.rlimit(resource, limits=None) |
+----------------------+---------------------------------+
- Except for 'pid' all psutil.Process class properties have been turned into
methods. This is the only case which there are no aliases.
Assuming "p = psutil.Process()":
+---------------+-----------------+
| Old name | Replacement |
+===============+=================+
| p.name | p.name() |
+---------------+-----------------+
| p.parent | p.parent() |
+---------------+-----------------+
| p.ppid | p.ppid() |
+---------------+-----------------+
| p.exe | p.exe() |
+---------------+-----------------+
| p.cmdline | p.cmdline() |
+---------------+-----------------+
| p.status | p.status() |
+---------------+-----------------+
| p.uids | p.uids() |
+---------------+-----------------+
| p.gids | p.gids() |
+---------------+-----------------+
| p.username | p.username() |
+---------------+-----------------+
| p.create_time | p.create_time() |
+---------------+-----------------+
- timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1.
- long deprecated psutil.error module is gone; exception classes now live in
"psutil" namespace only.
- Process instances' "retcode" attribute returned by psutil.wait_procs() has
been renamed to "returncode" for consistency with subprocess.Popen.
```
### 1.2.1
```
=====
*2013-11-25*
**Bug fixes**
- 348_: [Windows XP] fixed "ImportError: DLL load failed" occurring on module
import.
- 425_: [Solaris] crash on import due to failure at determining BOOT_TIME.
- 443_: [Linux] can't set CPU affinity on systems with more than 64 cores.
```
### 1.2.0
```
=====
*2013-11-20*
**Enhancements**
- 439_: assume os.getpid() if no argument is passed to psutil.Process
constructor.
- 440_: new psutil.wait_procs() utility function which waits for multiple
processes to terminate.
**Bug fixes**
- 348_: [Windows XP/Vista] fix "ImportError: DLL load failed" occurring on
module import.
```
### 1.1.3
```
=====
*2013-11-07*
**Bug fixes**
- 442_: [Linux] psutil won't compile on certain version of Linux because of
missing prlimit(2) syscall.
```
### 1.1.2
```
=====
*2013-10-22*
**Bug fixes**
- 442_: [Linux] psutil won't compile on Debian 6.0 because of missing
prlimit(2) syscall.
```
### 1.1.1
```
=====
*2013-10-08*
**Bug fixes**
- 442_: [Linux] psutil won't compile on kernels < 2.6.36 due to missing
prlimit(2) syscall.
```
### 1.1.0
```
=====
*2013-09-28*
**Enhancements**
- 410_: host tar.gz and windows binary files are on PYPI.
- 412_: [Linux] get/set process resource limits.
- 415_: [Windows] Process.get_children() is an order of magnitude faster.
- 426_: [Windows] Process.name is an order of magnitude faster.
- 431_: [UNIX] Process.name is slightly faster because it unnecessarily
retrieved also process cmdline.
**Bug fixes**
- 391_: [Windows] psutil.cpu_times_percent() returns negative percentages.
- 408_: STATUS_* and CONN_* constants don't properly serialize on JSON.
- 411_: [Windows] examples/disk_usage.py may pop-up a GUI error.
- 413_: [Windows] Process.get_memory_info() leaks memory.
- 414_: [Windows] Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER.
- 416_: psutil.disk_usage() doesn't work well with unicode path names.
- 430_: [Linux] process IO counters report wrong number of r/w syscalls.
- 435_: [Linux] psutil.net_io_counters() might report erreneous NIC names.
- 436_: [Linux] psutil.net_io_counters() reports a wrong 'dropin' value.
**API changes**
- 408_: turn STATUS_* and CONN_* constants into plain Python strings.
```
### 1.0.1
```
=====
*2013-07-12*
**Bug fixes**
- 405_: network_io_counters(pernic=True) no longer works as intended in 1.0.0.
```
### 1.0.0
```
=====
*2013-07-10*
**Enhancements**
- 18_: Solaris support (yay!) (thanks Justin Venus)
- 367_: Process.get_connections() 'status' strings are now constants.
- 380_: test suite exits with non-zero on failure. (patch by floppymaster)
- 391_: introduce unittest2 facilities and provide workarounds if unittest2
is not installed (python < 2.7).
**Bug fixes**
- 374_: [Windows] negative memory usage reported if process uses a lot of
memory.
- 379_: [Linux] Process.get_memory_maps() may raise ValueError.
- 394_: [OSX] Mapped memory regions report incorrect file name.
- 404_: [Linux] sched_*affinity() are implicitly declared. (patch by Arfrever)
**API changes**
- Process.get_connections() 'status' field is no longer a string but a
constant object (psutil.CONN_*).
- Process.get_connections() 'local_address' and 'remote_address' fields
renamed to 'laddr' and 'raddr'.
- psutil.network_io_counters() renamed to psutil.net_io_counters().
```
### 0.7.1
```
=====
*2013-05-03*
**Bug fixes**
- 325_: [BSD] psutil.virtual_memory() can raise SystemError.
(patch by Jan Beich)
- 370_: [BSD] Process.get_connections() requires root. (patch by John Baldwin)
- 372_: [BSD] different process methods raise NoSuchProcess instead of
AccessDenied.
```
### 0.7.0
```
=====
*2013-04-12*
**Enhancements**
- 233_: code migrated to Mercurial (yay!)
- 246_: psutil.error module is deprecated and scheduled for removal.
- 328_: [Windows] process IO nice/priority support.
- 359_: psutil.get_boot_time()
- 361_: [Linux] psutil.cpu_times() now includes new 'steal', 'guest' and
'guest_nice' fields available on recent Linux kernels.
Also, psutil.cpu_percent() is more accurate.
- 362_: cpu_times_percent() (per-CPU-time utilization as a percentage)
**Bug fixes**
- 234_: [Windows] disk_io_counters() fails to list certain disks.
- 264_: [Windows] use of psutil.disk_partitions() may cause a message box to
appear.
- 313_: [Linux] psutil.virtual_memory() and psutil.swap_memory() can crash on
certain exotic Linux flavors having an incomplete /proc interface.
If that's the case we now set the unretrievable stats to 0 and raise a
RuntimeWarning.
- 315_: [OSX] fix some compilation warnings.
- 317_: [Windows] cannot set process CPU affinity above 31 cores.
- 319_: [Linux] process get_memory_maps() raises KeyError 'Anonymous' on Debian
squeeze.
- 321_: [UNIX] Process.ppid property is no longer cached as the kernel may set
the ppid to 1 in case of a zombie process.
- 323_: [OSX] disk_io_counters()'s read_time and write_time parameters were
reporting microseconds not milliseconds. (patch by Gregory Szorc)
- 331_: Process cmdline is no longer cached after first acces as it may change.
- 333_: [OSX] Leak of Mach ports on OS X (patch by rsesekgoogle.com)
- 337_: [Linux] process methods not working because of a poor /proc
implementation will raise NotImplementedError rather than RuntimeError
and Process.as_dict() will not blow up. (patch by Curtin1060)
- 338_: [Linux] disk_io_counters() fails to find some disks.
- 339_: [FreeBSD] get_pid_list() can allocate all the memory on system.
- 341_: [Linux] psutil might crash on import due to error in retrieving system
terminals map.
- 344_: [FreeBSD] swap_memory() might return incorrect results due to
kvm_open(3) not being called. (patch by Jean Sebastien)
- 338_: [Linux] disk_io_counters() fails to find some disks.
- 351_: [Windows] if psutil is compiled with mingw32 (provided installers for
py2.4 and py2.5 are) disk_io_counters() will fail. (Patch by m.malycha)
- 353_: [OSX] get_users() returns an empty list on OSX 10.8.
- 356_: Process.parent now checks whether parent PID has been reused in which
case returns None.
- 365_: Process.set_nice() should check PID has not been reused by another
process.
- 366_: [FreeBSD] get_memory_maps(), get_num_fds(), get_open_files() and
getcwd() Process methods raise RuntimeError instead of AccessDenied.
**API changes**
- Process.cmdline property is no longer cached after first access.
- Process.ppid property is no longer cached after first access.
- [Linux] Process methods not working because of a poor /proc implementation
will raise NotImplementedError instead of RuntimeError.
- psutil.error module is deprecated and scheduled for removal.
```
### 0.6.1
```
=====
*2012-08-16*
**Enhancements**
- 316_: process cmdline property now makes a better job at guessing the process
executable from the cmdline.
**Bug fixes**
- 316_: process exe was resolved in case it was a symlink.
- 318_: python 2.4 compatibility was broken.
**API changes**
- process exe can now return an empty string instead of raising AccessDenied.
- process exe is no longer resolved in case it's a symlink.
```
### 0.6.0
```
=====
*2012-08-13*
**Enhancements**
- 216_: [POSIX] get_connections() UNIX sockets support.
- 220_: [FreeBSD] get_connections() has been rewritten in C and no longer
requires lsof.
- 222_: [OSX] add support for process cwd.
- 261_: process extended memory info.
- 295_: [OSX] process executable path is now determined by asking the OS
instead of being guessed from process cmdline.
- 297_: [OSX] the Process methods below were always raising AccessDenied for
any process except the current one. Now this is no longer true. Also
they are 2.5x faster.
- name
- get_memory_info()
- get_memory_percent()
- get_cpu_times()
- get_cpu_percent()
- get_num_threads()
- 300_: examples/pmap.py script.
- 301_: process_iter() now yields processes sorted by their PIDs.
- 302_: process number of voluntary and involuntary context switches.
- 303_: [Windows] the Process methods below were always raising AccessDenied
for any process not owned by current user. Now this is no longer true:
- create_time
- get_cpu_times()
- get_cpu_percent()
- get_memory_info()
- get_memory_percent()
- get_num_handles()
- get_io_counters()
- 305_: add examples/netstat.py script.
- 311_: system memory functions has been refactorized and rewritten and now
provide a more detailed and consistent representation of the system
memory. New psutil.virtual_memory() function provides the following
memory amounts:
- total
- available
- percent
- used
- active [POSIX]
- inactive [POSIX]
- buffers (BSD, Linux)
- cached (BSD, OSX)
- wired (OSX, BSD)
- shared [FreeBSD]
New psutil.swap_memory() provides:
- total
- used
- free
- percent
- sin (no. of bytes the system has swapped in from disk (cumulative))
- sout (no. of bytes the system has swapped out from disk (cumulative))
All old memory-related functions are deprecated.
Also two new example scripts were added: free.py and meminfo.py.
- 312_: psutil.network_io_counters() namedtuple includes 4 new fields:
errin, errout dropin and dropout, reflecting the number of packets
dropped and with errors.
**Bug fixes**
- 298_: [OSX and BSD] memory leak in get_num_fds().
- 299_: potential memory leak every time PyList_New(0) is used.
- 303_: [Windows] potential heap corruption in get_num_threads() and
get_status() Process methods.
- 305_: [FreeBSD] psutil can't compile on FreeBSD 9 due to removal of utmp.h.
- 306_: at C level, errors are not checked when invoking Py* functions which
create or manipulate Python objects leading to potential memory related
errors and/or segmentation faults.
- 307_: [FreeBSD] values returned by psutil.network_io_counters() are wrong.
- 308_: [BSD / Windows] psutil.virtmem_usage() wasn't actually returning
information about swap memory usage as it was supposed to do. It does
now.
- 309_: get_open_files() might not return files which can not be accessed
due to limited permissions. AccessDenied is now raised instead.
**API changes**
- psutil.phymem_usage() is deprecated (use psutil.virtual_memory())
- psutil.virtmem_usage() is deprecated (use psutil.swap_memory())
- psutil.phymem_buffers() on Linux is deprecated (use psutil.virtual_memory())
- psutil.cached_phymem() on Linux is deprecated (use psutil.virtual_memory())
- [Windows and BSD] psutil.virtmem_usage() now returns information about swap
memory instead of virtual memory.
```
### 0.5.1
```
=====
*2012-06-29*
**Enhancements**
- 293_: [Windows] process executable path is now determined by asking the OS
instead of being guessed from process cmdline.
**Bug fixes**
- 292_: [Linux] race condition in process files/threads/connections.
- 294_: [Windows] Process CPU affinity is only able to set CPU 0.
```
### 0.5.0
```
=====
*2012-06-27*
**Enhancements**
- 195_: [Windows] number of handles opened by process.
- 209_: psutil.disk_partitions() now provides also mount options.
- 229_: list users currently connected on the system (psutil.get_users()).
- 238_: [Linux, Windows] process CPU affinity (get and set).
- 242_: Process.get_children(recursive=True): return all process
descendants.
- 245_: [POSIX] Process.wait() incrementally consumes less CPU cycles.
- 257_: [Windows] removed Windows 2000 support.
- 258_: [Linux] Process.get_memory_info() is now 0.5x faster.
- 260_: process's mapped memory regions. (Windows patch by wj32.64, OSX patch
by Jeremy Whitlock)
- 262_: [Windows] psutil.disk_partitions() was slow due to inspecting the
floppy disk drive also when "all" argument was False.
- 273_: psutil.get_process_list() is deprecated.
- 274_: psutil no longer requires 2to3 at installation time in order to work
with Python 3.
- 278_: new Process.as_dict() method.
- 281_: ppid, name, exe, cmdline and create_time properties of Process class
are now cached after being accessed.
- 282_: psutil.STATUS_* constants can now be compared by using their string
representation.
- 283_: speedup Process.is_running() by caching its return value in case the
process is terminated.
- 284_: [POSIX] per-process number of opened file descriptors.
- 287_: psutil.process_iter() now caches Process instances between calls.
- 290_: Process.nice property is deprecated in favor of new get_nice() and
set_nice() methods.
**Bug fixes**
- 193_: psutil.Popen constructor can throw an exception if the spawned process
terminates quickly.
- 240_: [OSX] incorrect use of free() for Process.get_connections().
- 244_: [POSIX] Process.wait() can hog CPU resources if called against a
process which is not our children.
- 248_: [Linux] psutil.network_io_counters() might return erroneous NIC names.
- 252_: [Windows] process getcwd() erroneously raise NoSuchProcess for
processes owned by another user. It now raises AccessDenied instead.
- 266_: [Windows] psutil.get_pid_list() only shows 1024 processes.
(patch by Amoser)
- 267_: [OSX] Process.get_connections() - an erroneous remote address was
returned. (Patch by Amoser)
- 272_: [Linux] Porcess.get_open_files() - potential race condition can lead to
unexpected NoSuchProcess exception. Also, we can get incorrect reports
of not absolutized path names.
- 275_: [Linux] Process.get_io_counters() erroneously raise NoSuchProcess on
old Linux versions. Where not available it now raises
NotImplementedError.
- 286_: Process.is_running() doesn't actually check whether PID has been
reused.
- 314_: Process.get_children() can sometimes return non-children.
**API changes**
- Process.nice property is deprecated in favor of new get_nice() and set_nice()
methods.
- psutil.get_process_list() is deprecated.
- ppid, name, exe, cmdline and create_time properties of Process class are now
cached after being accessed, meaning NoSuchProcess will no longer be raised
in case the process is gone in the meantime.
- psutil.STATUS_* constants can now be compared by using their string
representation.
```
### 0.4.1
```
=====
*2011-12-14*
**Bug fixes**
- 228_: some example scripts were not working with python 3.
- 230_: [Windows / OSX] memory leak in Process.get_connections().
- 232_: [Linux] psutil.phymem_usage() can report erroneous values which are
different than "free" command.
- 236_: [Windows] memory/handle leak in Process's get_memory_info(),
suspend() and resume() methods.
```
### 0.4.0
```
=====
*2011-10-29*
**Enhancements**
- 150_: network I/O counters. (OSX and Windows patch by Jeremy Whitlock)
- 154_: [FreeBSD] add support for process getcwd()
- 157_: [Windows] provide installer for Python 3.2 64-bit.
- 198_: Process.wait(timeout=0) can now be used to make wait() return
immediately.
- 206_: disk I/O counters. (OSX and Windows patch by Jeremy Whitlock)
- 213_: examples/iotop.py script.
- 217_: Process.get_connections() now has a "kind" argument to filter
for connections with different criteria.
- 221_: [FreeBSD] Process.get_open_files has been rewritten in C and no longer
relies on lsof.
- 223_: examples/top.py script.
- 227_: examples/nettop.py script.
**Bug fixes**
- 135_: [OSX] psutil cannot create Process object.
- 144_: [Linux] no longer support 0 special PID.
- 188_: [Linux] psutil import error on Linux ARM architectures.
- 194_: [POSIX] psutil.Process.get_cpu_percent() now reports a percentage over
100 on multicore processors.
- 197_: [Linux] Process.get_connections() is broken on platforms not
supporting IPv6.
- 200_: [Linux] psutil.NUM_CPUS not working on armel and sparc architectures
and causing crash on module import.
- 201_: [Linux] Process.get_connections() is broken on big-endian
architectures.
- 211_: Process instance can unexpectedly raise NoSuchProcess if tested for
equality with another object.
- 218_: [Linux] crash at import time on Debian 64-bit because of a missing
line in /proc/meminfo.
- 226_: [FreeBSD] crash at import time on FreeBSD 7 and minor.
```
### 0.3.0
```
=====
*2011-07-08*
**Enhancements**
- 125_: system per-cpu percentage utilization and times.
- 163_: per-process associated terminal (TTY).
- 171_: added get_phymem() and get_virtmem() functions returning system
memory information (total, used, free) and memory percent usage.
total_* avail_* and used_* memory functions are deprecated.
- 172_: disk usage statistics.
- 174_: mounted disk partitions.
- 179_: setuptools is now used in setup.py
**Bug fixes**
- 159_: SetSeDebug() does not close handles or unset impersonation on return.
- 164_: [Windows] wait function raises a TimeoutException when a process
returns -1 .
- 165_: process.status raises an unhandled exception.
- 166_: get_memory_info() leaks handles hogging system resources.
- 168_: psutil.cpu_percent() returns erroneous results when used in
non-blocking mode. (patch by Philip Roberts)
- 178_: OSX - Process.get_threads() leaks memory
- 180_: [Windows] Process's get_num_threads() and get_threads() methods can
raise NoSuchProcess exception while process still exists.
```
### 0.2.1
```
=====
*2011-03-20*
**Enhancements**
- 64_: per-process I/O counters.
- 116_: per-process wait() (wait for process to terminate and return its exit
code).
- 134_: per-process get_threads() returning information (id, user and kernel
times) about threads opened by process.
- 136_: process executable path on FreeBSD is now determined by asking the
kernel instead of guessing it from cmdline[0].
- 137_: per-process real, effective and saved user and group ids.
- 140_: system boot time.
- 142_: per-process get and set niceness (priority).
- 143_: per-process status.
- 147_: per-process I/O nice (priority) - Linux only.
- 148_: psutil.Popen class which tidies up subprocess.Popen and psutil.Process
in a unique interface.
- 152_: [OSX] get_process_open_files() implementation has been rewritten
in C and no longer relies on lsof resulting in a 3x speedup.
- 153_: [OSX] get_process_connection() implementation has been rewritten
in C and no longer relies on lsof resulting in a 3x speedup.
**Bug fixes**
- 83_: process cmdline is empty on OSX 64-bit.
- 130_: a race condition can cause IOError exception be raised on
Linux if process disappears between open() and subsequent read() calls.
- 145_: WindowsError was raised instead of psutil.AccessDenied when using
process resume() or suspend() on Windows.
- 146_: 'exe' property on Linux can raise TypeError if path contains NULL
bytes.
- 151_: exe and getcwd() for PID 0 on Linux return inconsistent data.
**API changes**
- Process "uid" and "gid" properties are deprecated in favor of "uids" and
"gids" properties.
```
### 0.2.0
```
=====
*2010-11-13*
**Enhancements**
- 79_: per-process open files.
- 88_: total system physical cached memory.
- 88_: total system physical memory buffers used by the kernel.
- 91_: per-process send_signal() and terminate() methods.
- 95_: NoSuchProcess and AccessDenied exception classes now provide "pid",
"name" and "msg" attributes.
- 97_: per-process children.
- 98_: Process.get_cpu_times() and Process.get_memory_info now return
a namedtuple instead of a tuple.
- 103_: per-process opened TCP and UDP connections.
- 107_: add support for Windows 64 bit. (patch by cjgohlke)
- 111_: per-process executable name.
- 113_: exception messages now include process name and pid.
- 114_: process username Windows implementation has been rewritten in pure
C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
longer required as a third-party dependancy. (patch by wj32)
- 117_: added support for Windows 2000.
- 123_: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
new 'interval' parameter.
- 129_: per-process number of threads.
**Bug fixes**
- 80_: fixed warnings when installing psutil with easy_install.
- 81_: psutil fails to compile with Visual Studio.
- 94_: suspend() raises OSError instead of AccessDenied.
- 86_: psutil didn't compile against FreeBSD 6.x.
- 102_: orphaned process handles obtained by using OpenProcess in C were
left behind every time Process class was instantiated.
- 111_: path and name Process properties report truncated or erroneous
values on UNIX.
- 120_: cpu_percent() always returning 100% on OS X.
- 112_: uid and gid properties don't change if process changes effective
user/group id at some point.
- 126_: ppid, uid, gid, name, exe, cmdline and create_time properties are
no longer cached and correctly raise NoSuchProcess exception if the process
disappears.
**API changes**
- psutil.Process.path property is deprecated and works as an alias for "exe"
property.
- psutil.Process.kill(): signal argument was removed - to send a signal to the
process use send_signal(signal) method instead.
- psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
- psutil.cpu_times() returns a nametuple instead of a tuple.
- New psutil.Process methods: get_open_files(), get_connections(),
send_signal() and terminate().
- ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
cached and raise NoSuchProcess exception if process disappears.
- psutil.cpu_percent() no longer returns immediately (see issue 123).
- psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
immediately by default (see issue 123).
```
### 0.1.3
```
=====
*2010-03-02*
**Enhancements**
- 14_: per-process username
- 51_: per-process current working directory (Windows and Linux only)
- 59_: Process.is_running() is now 10 times faster
- 61_: added supoprt for FreeBSD 64 bit
- 71_: implemented suspend/resume process
- 75_: python 3 support
**Bug fixes**
- 36_: process cpu_times() and memory_info() functions succeeded also for dead
processes while a NoSuchProcess exception is supposed to be raised.
- 48_: incorrect size for mib array defined in getcmdargs for BSD
- 49_: possible memory leak due to missing free() on error condition on
- 50_: fixed getcmdargs() memory fragmentation on BSD
- 55_: test_pid_4 was failing on Windows Vista
- 57_: some unit tests were failing on systems where no swap memory is
available
- 58_: is_running() is now called before kill() to make sure we are going
to kill the correct process.
- 73_: virtual memory size reported on OS X includes shared library size
- 77_: NoSuchProcess wasn't raised on Process.create_time if kill() was
used first.
```
### 0.1.2
```
=====
*2009-05-06*
**Enhancements**
- 32_: Per-process CPU user/kernel times
- 33_: Process create time
- 34_: Per-process CPU utilization percentage
- 38_: Per-process memory usage (bytes)
- 41_: Per-process memory utilization (percent)
- 39_: System uptime
- 43_: Total system virtual memory
- 46_: Total system physical memory
- 44_: Total system used/free virtual and physical memory
**Bug fixes**
- 36_: [Windows] NoSuchProcess not raised when accessing timing methods.
- 40_: test_get_cpu_times() failing on FreeBSD and OS X.
- 42_: [Windows] get_memory_percent() raises AccessDenied.
```
### 0.1.1
```
=====
*2009-03-06*
**Enhancements**
- 4_: FreeBSD support for all functions of psutil
- 9_: Process.uid and Process.gid now retrieve process UID and GID.
- 11_: Support for parent/ppid - Process.parent property returns a
Process object representing the parent process, and Process.ppid returns
the parent PID.
- 12_ & 15:
NoSuchProcess exception now raised when creating an object
for a nonexistent process, or when retrieving information about a process
that has gone away.
- 21_: AccessDenied exception created for raising access denied errors
from OSError or WindowsError on individual platforms.
- 26_: psutil.process_iter() function to iterate over processes as
Process objects with a generator.
- Process objects can now also be compared with == operator for equality
(PID, name, command line are compared).
**Bug fixes**
- 16_: [Windows] Special case for "System Idle Process" (PID 0) which
otherwise would return an "invalid parameter" exception.
- 17_: get_process_list() ignores NoSuchProcess and AccessDenied
exceptions during building of the list.
- 22_: [Windows] Process(0).kill() was failing with an unset exception.
- 23_: Special case for pid_exists(0)
- 24_: [Windows] Process(0).kill() now raises AccessDenied exception instead
of WindowsError.
- 30_: psutil.get_pid_list() was returning two ins
.. _1: https://github.com/giampaolo/psutil/issues/1
.. _2: https://github.com/giampaolo/psutil/issues/2
.. _3: https://github.com/giampaolo/psutil/issues/3
.. _4: https://github.com/giampaolo/psutil/issues/4
.. _5: https://github.com/giampaolo/psutil/issues/5
.. _6: https://github.com/giampaolo/psutil/issues/6
.. _7: https://github.com/giampaolo/psutil/issues/7
.. _8: https://github.com/giampaolo/psutil/issues/8
.. _9: https://github.com/giampaolo/psutil/issues/9
.. _10: https://github.com/giampaolo/psutil/issues/10
.. _11: https://github.com/giampaolo/psutil/issues/11
.. _12: https://github.com/giampaolo/psutil/issues/12
.. _13: https://github.com/giampaolo/psutil/issues/13
.. _14: https://github.com/giampaolo/psutil/issues/14
.. _15: http
This PR pins psutil to the latest release 5.4.3.
Changelog
### 5.4.3 ``` ===== *2018-01-01* **Enhancements** - 775_: disk_partitions() on Windows return mount points. **Bug fixes** - 1193_: pids() may return False on OSX. ``` ### 5.4.2 ``` ===== *2017-12-07* **Enhancements** - 1173_: introduced PSUTIL_DEBUG environment variable which can be set in order to print useful debug messages on stderr (useful in case of nasty errors). - 1177_: added support for sensors_battery() on OSX. (patch by Arnon Yaari) - 1183_: Process.children() is 2x faster on UNIX and 2.4x faster on Linux. - 1188_: deprecated method Process.memory_info_ex() now warns by using FutureWarning instead of DeprecationWarning. **Bug fixes** - 1152_: [Windows] disk_io_counters() may return an empty dict. - 1169_: [Linux] users() "hostname" returns username instead. (patch by janderbrain) - 1172_: [Windows] `make test` does not work. - 1179_: [Linux] Process.cmdline() is now able to splits cmdline args for misbehaving processes which overwrite /proc/pid/cmdline and use spaces instead of null bytes as args separator. - 1181_: [OSX] Process.memory_maps() may raise ENOENT. - 1187_: [OSX] pids() does not return PID 0 on recent OSX versions. ``` ### 5.4.1 ``` ===== *2017-11-08* **Enhancements** - 1164_: [AIX] add support for Process.num_ctx_switches(). (patch by Arnon Yaari) - 1053_: abandon Python 3.3 support (psutil still works but it's no longer tested). **Bug fixes** - 1150_: [Windows] when a process is terminate()d now the exit code is set to SIGTERM instead of 0. (patch by Akos Kiss) - 1151_: python -m psutil.tests fail - 1154_: [AIX] psutil won't compile on AIX 6.1.0. (patch by Arnon Yaari) - 1167_: [Windows] net_io_counter() packets count now include also non-unicast packets. (patch by Matthew Long) ``` ### 5.4.0 ``` ===== *2017-10-12* **Enhancements** - 1123_: [AIX] added support for AIX platform. (patch by Arnon Yaari) **Bug fixes** - 1009_: [Linux] sensors_temperatures() may crash with IOError. - 1012_: [Windows] disk_io_counters()'s read_time and write_time were expressed in tens of micro seconds instead of milliseconds. - 1127_: [OSX] invalid reference counting in Process.open_files() may lead to segfault. (patch by Jakub Bacic) - 1129_: [Linux] sensors_fans() may crash with IOError. (patch by Sebastian Saip) - 1131_: [SunOS] fix compilation warnings. (patch by Arnon Yaari) - 1133_: [Windows] can't compile on newer versions of Visual Studio 2017 15.4. (patch by Max Bélanger) - 1138_: [Linux] can't compile on CentOS 5.0 and RedHat 5.0. (patch by Prodesire) ``` ### 5.3.1 ``` ===== *2017-09-10* **Enhancements** - 1124_: documentation moved to http://psutil.readthedocs.io **Bug fixes** - 1105_: [FreeBSD] psutil does not compile on FreeBSD 12. - 1125_: [BSD] net_connections() raises TypeError. **Compatibility notes** - 1120_: .exe files for Windows are no longer uploaded on PYPI as per PEP-527; only wheels are provided. ``` ### 5.3.0 ``` ===== *2017-09-01* **Enhancements** - 802_: disk_io_counters() and net_io_counters() numbers no longer wrap (restart from 0). Introduced a new "nowrap" argument. - 928_: psutil.net_connections() and psutil.Process.connections() "laddr" and "raddr" are now named tuples. - 1015_: swap_memory() now relies on /proc/meminfo instead of sysinfo() syscall so that it can be used in conjunction with PROCFS_PATH in order to retrieve memory info about Linux containers such as Docker and Heroku. - 1022_: psutil.users() provides a new "pid" field. - 1025_: process_iter() accepts two new parameters in order to invoke Process.as_dict(): "attrs" and "ad_value". With this you can iterate over all processes in one shot without needing to catch NoSuchProcess and do list/dict comprehensions. - 1040_: implemented full unicode support. - 1051_: disk_usage() on Python 3 is now able to accept bytes. - 1058_: test suite now enables all warnings by default. - 1060_: source distribution is dynamically generated so that it only includes relevant files. - 1079_: [FreeBSD] net_connections()'s fd number is now being set for real (instead of -1). (patch by Gleb Smirnoff) - 1091_: [SunOS] implemented Process.environ(). (patch by Oleksii Shevchuk) **Bug fixes** - 989_: [Windows] boot_time() may return a negative value. - 1007_: [Windows] boot_time() can have a 1 sec fluctuation between calls; the value of the first call is now cached so that boot_time() always returns the same value if fluctuation is <= 1 second. - 1013_: [FreeBSD] psutil.net_connections() may return incorrect PID. (patch by Gleb Smirnoff) - 1014_: [Linux] Process class can mask legitimate ENOENT exceptions as NoSuchProcess. - 1016_: disk_io_counters() raises RuntimeError on a system with no disks. - 1017_: net_io_counters() raises RuntimeError on a system with no network cards installed. - 1021_: [Linux] open_files() may erroneously raise NoSuchProcess instead of skipping a file which gets deleted while open files are retrieved. - 1029_: [OSX, FreeBSD] Process.connections('unix') on Python 3 doesn't properly handle unicode paths and may raise UnicodeDecodeError. - 1033_: [OSX, FreeBSD] memory leak for net_connections() and Process.connections() when retrieving UNIX sockets (kind='unix'). - 1040_: fixed many unicode related issues such as UnicodeDecodeError on Python 3 + UNIX and invalid encoded data on Windows. - 1042_: [FreeBSD] psutil won't compile on FreeBSD 12. - 1044_: [OSX] different Process methods incorrectly raise AccessDenied for zombie processes. - 1046_: [Windows] disk_partitions() on Windows overrides user's SetErrorMode. - 1047_: [Windows] Process username(): memory leak in case exception is thrown. - 1048_: [Windows] users()'s host field report an invalid IP address. - 1050_: [Windows] Process.memory_maps memory() leaks memory. - 1055_: cpu_count() is no longer cached; this is useful on systems such as Linux where CPUs can be disabled at runtime. This also reflects on Process.cpu_percent() which no longer uses the cache. - 1058_: fixed Python warnings. - 1062_: disk_io_counters() and net_io_counters() raise TypeError if no disks or NICs are installed on the system. - 1063_: [NetBSD] net_connections() may list incorrect sockets. - 1064_: [NetBSD] swap_memory() may segfault in case of error. - 1065_: [OpenBSD] Process.cmdline() may raise SystemError. - 1067_: [NetBSD] Process.cmdline() leaks memory if process has terminated. - 1069_: [FreeBSD] Process.cpu_num() may return 255 for certain kernel processes. - 1071_: [Linux] cpu_freq() may raise IOError on old RedHat distros. - 1074_: [FreeBSD] sensors_battery() raises OSError in case of no battery. - 1075_: [Windows] net_if_addrs(): inet_ntop() return value is not checked. - 1077_: [SunOS] net_if_addrs() shows garbage addresses on SunOS 5.10. (patch by Oleksii Shevchuk) - 1077_: [SunOS] net_connections() does not work on SunOS 5.10. (patch by Oleksii Shevchuk) - 1079_: [FreeBSD] net_connections() didn't list locally connected sockets. (patch by Gleb Smirnoff) - 1085_: cpu_count() return value is now checked and forced to None if <= 1. - 1087_: Process.cpu_percent() guard against cpu_count() returning None and assumes 1 instead. - 1093_: [SunOS] memory_maps() shows wrong 64 bit addresses. - 1094_: [Windows] psutil.pid_exists() may lie. Also, all process APIs relying on OpenProcess Windows API now check whether the PID is actually running. - 1098_: [Windows] Process.wait() may erroneously return sooner, when the PID is still alive. - 1099_: [Windows] Process.terminate() may raise AccessDenied even if the process already died. - 1101_: [Linux] sensors_temperatures() may raise ENODEV. **Porting notes** - 1039_: returned types consolidation: - Windows / Process.cpu_times(): fields 3 and 4 were int instead of float - Linux / FreeBSD: connections('unix'): raddr is now set to "" instead of None - OpenBSD: connections('unix'): laddr and raddr are now set to "" instead of None - 1040_: all strings are encoded by using OS fs encoding. - 1040_: the following Windows APIs on Python 2 now return a string instead of unicode: - Process.memory_maps().path - WindowsService.bin_path() - WindowsService.description() - WindowsService.display_name() - WindowsService.username() ``` ### 5.2.2 ``` ===== *2017-04-10* **Bug fixes** - 1000_: fixed some setup.py warnings. - 1002_: [SunOS] remove C macro which will not be available on new Solaris versions. (patch by Danek Duvall) - 1004_: [Linux] Process.io_counters() may raise ValueError. - 1006_: [Linux] cpu_freq() may return None on some Linux versions does not support the function; now the function is not declared instead. - 1009_: [Linux] sensors_temperatures() may raise OSError. - 1010_: [Linux] virtual_memory() may raise ValueError on Ubuntu 14.04. ``` ### 5.2.1 ``` ===== *2017-03-24* **Bug fixes** - 981_: [Linux] cpu_freq() may return an empty list. - 993_: [Windows] Process.memory_maps() on Python 3 may raise UnicodeDecodeError. - 996_: [Linux] sensors_temperatures() may not show all temperatures. - 997_: [FreeBSD] virtual_memory() may fail due to missing sysctl parameter on FreeBSD 12. ``` ### 5.2.0 ``` ===== *2017-03-05* **Enhancements** - 971_: [Linux] Add psutil.sensors_fans() function. (patch by Nicolas Hennion) - 976_: [Windows] Process.io_counters() has 2 new fields: *other_count* and *other_bytes*. - 976_: [Linux] Process.io_counters() has 2 new fields: *read_chars* and *write_chars*. **Bug fixes** - 872_: [Linux] can now compile on Linux by using MUSL C library. - 985_: [Windows] Fix a crash in `Process.open_files` when the worker thread for `NtQueryObject` times out. - 986_: [Linux] Process.cwd() may raise NoSuchProcess instead of ZombieProcess. ``` ### 5.1.3 ``` ===== **Bug fixes** - 971_: [Linux] sensors_temperatures() didn't work on CentOS 7. - 973_: cpu_percent() may raise ZeroDivisionError. ``` ### 5.1.2 ``` ===== *2017-02-03* **Bug fixes** - 966_: [Linux] sensors_battery().power_plugged may erroneously return None on Python 3. - 968_: [Linux] disk_io_counters() raises TypeError on python 3. - 970_: [Linux] sensors_battery()'s name and label fields on Python 3 are bytes instead of str. ``` ### 5.1.1 ``` ===== *2017-02-03* **Enhancements** - 966_: [Linux] sensors_battery().percent is a float and is more precise. **Bug fixes** - 964_: [Windows] Process.username() and psutil.users() may return badly decoding character on Python 3. - 965_: [Linux] disk_io_counters() may miscalculate sector size and report the wrong number of bytes read and written. - 966_: [Linux] sensors_battery() may fail with "no such file error". - 966_: [Linux] sensors_battery().power_plugged may lie. ``` ### 5.1.0 ``` ===== *2017-02-01* **Enhancements** - 357_: added psutil.Process.cpu_num() (what CPU a process is on). - 371_: added psutil.sensors_temperatures() (Linux only). - 941_: added psutil.cpu_freq() (CPU frequency). - 955_: added psutil.sensors_battery() (Linux, Windows, only). - 956_: cpu_affinity([]) can now be used as an alias to set affinity against all eligible CPUs. **Bug fixes** - 687_: [Linux] pid_exists() no longer returns True if passed a process thread ID. - 948_: cannot install psutil with PYTHONOPTIMIZE=2. - 950_: [Windows] Process.cpu_percent() was calculated incorrectly and showed higher number than real usage. - 951_: [Windows] the uploaded wheels for Python 3.6 64 bit didn't work. - 959_: psutil exception objects could not be pickled. - 960_: Popen.wait() did not return the correct negative exit status if process is ``kill()``ed by a signal. - 961_: [Windows] WindowsService.description() may fail with ERROR_MUI_FILE_NOT_FOUND. ``` ### 5.0.1 ``` ===== *2016-12-21* **Enhancements** - 939_: tar.gz distribution went from 1.8M to 258K. - 811_: [Windows] provide a more meaningful error message if trying to use psutil on unsupported Windows XP. **Bug fixes** - 609_: [SunOS] psutil does not compile on Solaris 10. - 936_: [Windows] fix compilation error on VS 2013 (patch by Max Bélanger). - 940_: [Linux] cpu_percent() and cpu_times_percent() was calculated incorrectly as "iowait", "guest" and "guest_nice" times were not properly taken into account. - 944_: [OpenBSD] psutil.pids() was omitting PID 0. ``` ### 5.0.0 ``` ===== *2016-11-06* **Enhncements** - 799_: new Process.oneshot() context manager making Process methods around +2x faster in general and from +2x to +6x faster on Windows. - 943_: better error message in case of version conflict on import. **Bug fixes** - 932_: [NetBSD] net_connections() and Process.connections() may fail without raising an exception. - 933_: [Windows] memory leak in cpu_stats() and WindowsService.description(). ``` ### 4.4.2 ``` ===== *2016-10-26* **Bug fixes** - 931_: psutil no longer compiles on Solaris. ``` ### 4.4.1 ``` ===== *2016-10-25* **Bug fixes** - 927_: ``Popen.__del__`` may cause maximum recursion depth error. ``` ### 4.4.0 ``` ===== *2016-10-23* **Enhancements** - 874_: [Windows] net_if_addrs() returns also the netmask. - 887_: [Linux] virtual_memory()'s 'available' and 'used' values are more precise and match "free" cmdline utility. "available" also takes into account LCX containers preventing "available" to overflow "total". - 891_: procinfo.py script has been updated and provides a lot more info. **Bug fixes** - 514_: [OSX] possibly fix Process.memory_maps() segfault (critical!). - 783_: [OSX] Process.status() may erroneously return "running" for zombie processes. - 798_: [Windows] Process.open_files() returns and empty list on Windows 10. - 825_: [Linux] cpu_affinity; fix possible double close and use of unopened socket. - 880_: [Windows] Handle race condition inside psutil_net_connections. - 885_: ValueError is raised if a negative integer is passed to cpu_percent() functions. - 892_: [Linux] Process.cpu_affinity([-1]) raise SystemError with no error set; now ValueError is raised. - 906_: [BSD] disk_partitions(all=False) returned an empty list. Now the argument is ignored and all partitions are always returned. - 907_: [FreeBSD] Process.exe() may fail with OSError(ENOENT). - 908_: [OSX, BSD] different process methods could errounesuly mask the real error for high-privileged PIDs and raise NoSuchProcess and AccessDenied instead of OSError and RuntimeError. - 909_: [OSX] Process open_files() and connections() methods may raise OSError with no exception set if process is gone. - 916_: [OSX] fix many compilation warnings. ``` ### 4.3.1 ``` ===== *2016-09-01* **Enhancements** - 881_: "make install" now works also when using a virtual env. **Bug fixes** - 854_: Process.as_dict() raises ValueError if passed an erroneous attrs name. - 857_: [SunOS] Process cpu_times(), cpu_percent(), threads() amd memory_maps() may raise RuntimeError if attempting to query a 64bit process with a 32bit python. "Null" values are returned as a fallback. - 858_: Process.as_dict() should not return memory_info_ex() because it's deprecated. - 863_: [Windows] memory_map truncates addresses above 32 bits - 866_: [Windows] win_service_iter() and services in general are not able to handle unicode service names / descriptions. - 869_: [Windows] Process.wait() may raise TimeoutExpired with wrong timeout unit (ms instead of sec). - 870_: [Windows] Handle leak inside psutil_get_process_data. ``` ### 4.3.0 ``` ===== *2016-06-18* **Enhancements** - 819_: [Linux] different speedup improvements: Process.ppid() is 20% faster Process.status() is 28% faster Process.name() is 25% faster Process.num_threads is 20% faster on Python 3 **Bug fixes** - 810_: [Windows] Windows wheels are incompatible with pip 7.1.2. - 812_: [NetBSD] fix compilation on NetBSD-5.x. - 823_: [NetBSD] virtual_memory() raises TypeError on Python 3. - 829_: [UNIX] psutil.disk_usage() percent field takes root reserved space into account. - 816_: [Windows] fixed net_io_counter() values wrapping after 4.3GB in Windows Vista (NT 6.0) and above using 64bit values from newer win APIs. ``` ### 4.2.0 ``` ===== *2016-05-14* **Enhancements** - 795_: [Windows] new APIs to deal with Windows services: win_service_iter() and win_service_get(). - 800_: [Linux] psutil.virtual_memory() returns a new "shared" memory field. - 819_: [Linux] speedup /proc parsing: - Process.ppid() is 20% faster - Process.status() is 28% faster - Process.name() is 25% faster - Process.num_threads is 20% faster on Python 3 **Bug fixes** - 797_: [Linux] net_if_stats() may raise OSError for certain NIC cards. - 813_: Process.as_dict() should ignore extraneous attribute names which gets attached to the Process instance. ``` ### 4.1.0 ``` ===== *2016-03-12* **Enhancements** - 777_: [Linux] Process.open_files() on Linux return 3 new fields: position, mode and flags. - 779_: Process.cpu_times() returns two new fields, 'children_user' and 'children_system' (always set to 0 on OSX and Windows). - 789_: [Windows] psutil.cpu_times() return two new fields: "interrupt" and "dpc". Same for psutil.cpu_times_percent(). - 792_: new psutil.cpu_stats() function returning number of CPU ctx switches interrupts, soft interrupts and syscalls. **Bug fixes** - 774_: [FreeBSD] net_io_counters() dropout is no longer set to 0 if the kernel provides it. - 776_: [Linux] Process.cpu_affinity() may erroneously raise NoSuchProcess. (patch by wxwright) - 780_: [OSX] psutil does not compile with some gcc versions. - 786_: net_if_addrs() may report incomplete MAC addresses. - 788_: [NetBSD] virtual_memory()'s buffers and shared values were set to 0. - 790_: [OSX] psutil won't compile on OSX 10.4. ``` ### 4.0.0 ``` ===== *2016-02-17* **Enhancements** - 523_: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field. - 660_: [Windows] make.bat is smarter in finding alternative VS install locations. (patch by mpderbec) - 732_: Process.environ(). (patch by Frank Benkstein) - 753_: [Linux, OSX, Windows] Process USS and PSS (Linux) "real" memory stats. (patch by Eric Rahm) - 755_: Process.memory_percent() "memtype" parameter. - 758_: tests now live in psutil namespace. - 760_: expose OS constants (psutil.LINUX, psutil.OSX, etc.) - 756_: [Linux] disk_io_counters() return 2 new fields: read_merged_count and write_merged_count. - 762_: new scripts/procsmem.py script. **Bug fixes** - 685_: [Linux] virtual_memory() provides wrong results on systems with a lot of physical memory. - 704_: [Solaris] psutil does not compile on Solaris sparc. - 734_: on Python 3 invalid UTF-8 data is not correctly handled for process name(), cwd(), exe(), cmdline() and open_files() methods resulting in UnicodeDecodeError exceptions. 'surrogateescape' error handler is now used as a workaround for replacing the corrupted data. - 737_: [Windows] when the bitness of psutil and the target process was different cmdline() and cwd() could return a wrong result or incorrectly report an AccessDenied error. - 741_: [OpenBSD] psutil does not compile on mips64. - 751_: [Linux] fixed call to Py_DECREF on possible Null object. - 754_: [Linux] cmdline() can be wrong in case of zombie process. - 759_: [Linux] Process.memory_maps() may return paths ending with " (deleted)" - 761_: [Windows] psutil.boot_time() wraps to 0 after 49 days. - 764_: [NetBSD] fix compilation on NetBSD-6.x. - 766_: [Linux] net_connections() can't handle malformed /proc/net/unix file. - 767_: [Linux] disk_io_counters() may raise ValueError on 2.6 kernels and it's broken on 2.4 kernels. - 770_: [NetBSD] disk_io_counters() metrics didn't update. ``` ### 3.4.2 ``` ===== *2016-01-20* **Enhancements** - 728_: [Solaris] exposed psutil.PROCFS_PATH constant to change the default location of /proc filesystem. **Bug fixes** - 724_: [FreeBSD] psutil.virtual_memory().total is incorrect. - 730_: [FreeBSD] psutil.virtual_memory() crashes. ``` ### 3.4.1 ``` ===== *2016-01-15* **Enhancements** - 557_: [NetBSD] added NetBSD support. (contributed by Ryo Onodera and Thomas Klausner) - 708_: [Linux] psutil.net_connections() and Process.connections() on Python 2 can be up to 3x faster in case of many connections. Also psutil.Process.memory_maps() is slightly faster. - 718_: process_iter() is now thread safe. **Bug fixes** - 714_: [OpenBSD] virtual_memory().cached value was always set to 0. - 715_: don't crash at import time if cpu_times() fail for some reason. - 717_: [Linux] Process.open_files fails if deleted files still visible. - 722_: [Linux] swap_memory() no longer crashes if sin/sout can't be determined due to missing /proc/vmstat. - 724_: [FreeBSD] virtual_memory().total is slightly incorrect. ``` ### 3.3.0 ``` ===== *2015-11-25* **Enhancements** - 558_: [Linux] exposed psutil.PROCFS_PATH constant to change the default location of /proc filesystem. - 615_: [OpenBSD] added OpenBSD support. (contributed by Landry Breuil) **Bug fixes** - 692_: [UNIX] Process.name() is no longer cached as it may change. ``` ### 3.2.2 ``` ===== *2015-10-04* **Bug fixes** - 517_: [SunOS] net_io_counters failed to detect network interfaces correctly on Solaris 10 - 541_: [FreeBSD] disk_io_counters r/w times were expressed in seconds instead of milliseconds. (patch by dasumin) - 610_: [SunOS] fix build and tests on Solaris 10 - 623_: [Linux] process or system connections raises ValueError if IPv6 is not supported by the system. - 678_: [Linux] can't install psutil due to bug in setup.py. - 688_: [Windows] compilation fails with MSVC 2015, Python 3.5. (patch by Mike Sarahan) ``` ### 3.2.1 ``` ===== *2015-09-03* **Bug fixes** - 677_: [Linux] can't install psutil due to bug in setup.py. ``` ### 3.2.0 ``` ===== *2015-09-02* **Enhancements** - 644_: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals to use with Process.send_signal(). - 648_: CI test integration for OSX. (patch by Jeff Tang) - 663_: [UNIX] net_if_addrs() now returns point-to-point (VPNs) addresses. - 655_: [Windows] different issues regarding unicode handling were fixed. On Python 2 all APIs returning a string will now return an encoded version of it by using sys.getfilesystemencoding() codec. The APIs involved are: - psutil.net_if_addrs() - psutil.net_if_stats() - psutil.net_io_counters() - psutil.Process.cmdline() - psutil.Process.name() - psutil.Process.username() - psutil.users() **Bug fixes** - 513_: [Linux] fixed integer overflow for RLIM_INFINITY. - 641_: [Windows] fixed many compilation warnings. (patch by Jeff Tang) - 652_: [Windows] net_if_addrs() UnicodeDecodeError in case of non-ASCII NIC names. - 655_: [Windows] net_if_stats() UnicodeDecodeError in case of non-ASCII NIC names. - 659_: [Linux] compilation error on Suse 10. (patch by maozguttman) - 664_: [Linux] compilation error on Alpine Linux. (patch by Bart van Kleef) - 670_: [Windows] segfgault of net_if_addrs() in case of non-ASCII NIC names. (patch by sk6249) - 672_: [Windows] compilation fails if using Windows SDK v8.0. (patch by Steven Winfield) - 675_: [Linux] net_connections(); UnicodeDecodeError may occur when listing UNIX sockets. ``` ### 3.1.1 ``` ===== *2015-07-15* **Bug fixes** - 603_: [Linux] ionice_set value range is incorrect. (patch by spacewander) - 645_: [Linux] psutil.cpu_times_percent() may produce negative results. - 656_: 'from psutil import *' does not work. ``` ### 3.1.0 ``` ===== *2015-07-15* **Enhancements** - 534_: [Linux] disk_partitions() added support for ZFS filesystems. - 646_: continuous tests integration for Windows with https://ci.appveyor.com/project/giampaolo/psutil. - 647_: new dev guide: https://github.com/giampaolo/psutil/blob/master/DEVGUIDE.rst - 651_: continuous code quality test integration with scrutinizer-ci.com **Bug fixes** - 340_: [Windows] Process.open_files() no longer hangs. Instead it uses a thred which times out and skips the file handle in case it's taking too long to be retrieved. (patch by Jeff Tang, PR 597) - 627_: [Windows] Process.name() no longer raises AccessDenied for pids owned by another user. - 636_: [Windows] Process.memory_info() raise AccessDenied. - 637_: [UNIX] raise exception if trying to send signal to Process PID 0 as it will affect os.getpid()'s process group instead of PID 0. - 639_: [Linux] Process.cmdline() can be truncated. - 640_: [Linux] *connections functions may swallow errors and return an incomplete list of connnections. - 642_: repr() of exceptions is incorrect. - 653_: [Windows] Add inet_ntop function for Windows XP to support IPv6. - 641_: [Windows] Replace deprecated string functions with safe equivalents. ``` ### 3.0.1 ``` ===== *2015-06-18* **Bug fixes** - 632_: [Linux] better error message if cannot parse process UNIX connections. - 634_: [Linux] Proces.cmdline() does not include empty string arguments. - 635_: [UNIX] crash on module import if 'enum' package is installed on python < 3.4. ``` ### 3.0.0 ``` ===== *2015-06-13* **Enhancements** - 250_: new psutil.net_if_stats() returning NIC statistics (isup, duplex, speed, MTU). - 376_: new psutil.net_if_addrs() returning all NIC addresses a-la ifconfig. - 469_: on Python >= 3.4 ``IOPRIO_CLASS_*`` and ``*_PRIORITY_CLASS`` constants returned by psutil.Process' ionice() and nice() methods are enums instead of plain integers. - 581_: add .gitignore. (patch by Gabi Davar) - 582_: connection constants returned by psutil.net_connections() and psutil.Process.connections() were turned from int to enums on Python > 3.4. - 587_: Move native extension into the package. - 589_: Process.cpu_affinity() accepts any kind of iterable (set, tuple, ...), not only lists. - 594_: all deprecated APIs were removed. - 599_: [Windows] process name() can now be determined for all processes even when running as a limited user. - 602_: pre-commit GIT hook. - 629_: enhanced support for py.test and nose test discovery and tests run. - 616_: [Windows] Add inet_ntop function for Windows XP. **Bug fixes** - 428_: [all UNIXes except Linux] correct handling of zombie processes; introduced new ZombieProcess exception class. - 512_: [BSD] fix segfault in net_connections(). - 555_: [Linux] psutil.users() correctly handles ":0" as an alias for "localhost" - 579_: [Windows] Fixed open_files() for PID>64K. - 579_: [Windows] fixed many compiler warnings. - 585_: [FreeBSD] net_connections() may raise KeyError. - 586_: [FreeBSD] cpu_affinity() segfaults on set in case an invalid CPU number is provided. - 593_: [FreeBSD] Process().memory_maps() segfaults. - 606_: Process.parent() may swallow NoSuchProcess exceptions. - 611_: [SunOS] net_io_counters has send and received swapped - 614_: [Linux]: cpu_count(logical=False) return the number of physical CPUs instead of physical cores. - 618_: [SunOS] swap tests fail on Solaris when run as normal user - 628_: [Linux] Process.name() truncates process name in case it contains spaces or parentheses. ``` ### 2.2.1 ``` ===== *2015-02-02* **Bug fixes** - 496_: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references" (patch by Bruno Binet) ``` ### 2.2.0 ``` ===== *2015-01-06* **Enhancements** - 521_: drop support for Python 2.4 and 2.5. - 553_: new examples/pstree.py script. - 564_: C extension version mismatch in case the user messed up with psutil installation or with sys.path is now detected at import time. - 568_: New examples/pidof.py script. - 569_: [FreeBSD] add support for process CPU affinity. **Bug fixes** - 496_: [Solaris] can't import psutil. - 547_: [UNIX] Process.username() may raise KeyError if UID can't be resolved. - 551_: [Windows] get rid of the unicode hack for net_io_counters() NIC names. - 556_: [Linux] lots of file handles were left open. - 561_: [Linux] net_connections() might skip some legitimate UNIX sockets. (patch by spacewander) - 565_: [Windows] use proper encoding for psutil.Process.username() and psutil.users(). (patch by Sylvain Mouquet) - 567_: [Linux] in the alternative implementation of CPU affinity PyList_Append and Py_BuildValue return values are not checked. - 569_: [FreeBSD] fix memory leak in psutil.cpu_count(logical=False). - 571_: [Linux] Process.open_files() might swallow AccessDenied exceptions and return an incomplete list of open files. ``` ### 2.1.3 ``` ===== *2014-09-26* - 536_: [Linux]: fix "undefined symbol: CPU_ALLOC" compilation error. ``` ### 2.1.2 ``` ===== *2014-09-21* **Enhancements** - 407_: project moved from Google Code to Github; code moved from Mercurial to Git. - 492_: use tox to run tests on multiple python versions. (patch by msabramo) - 505_: [Windows] distribution as wheel packages. - 511_: new examples/ps.py sample code. **Bug fixes** - 340_: [Windows] Process.get_open_files() no longer hangs. (patch by Jeff Tang) - 501_: [Windows] disk_io_counters() may return negative values. - 503_: [Linux] in rare conditions Process exe(), open_files() and connections() methods can raise OSError(ESRCH) instead of NoSuchProcess. - 504_: [Linux] can't build RPM packages via setup.py - 506_: [Linux] python 2.4 support was broken. - 522_: [Linux] Process.cpu_affinity() might return EINVAL. (patch by David Daeschler) - 529_: [Windows] Process.exe() may raise unhandled WindowsError exception for PIDs 0 and 4. (patch by Jeff Tang) - 530_: [Linux] psutil.disk_io_counters() may crash on old Linux distros (< 2.6.5) (patch by Yaolong Huang) - 533_: [Linux] Process.memory_maps() may raise TypeError on old Linux distros. ``` ### 2.1.1 ``` ===== *2014-04-30* **Bug fixes** - 446_: [Windows] fix encoding error when using net_io_counters() on Python 3. (patch by Szigeti Gabor Niif) - 460_: [Windows] net_io_counters() wraps after 4G. - 491_: [Linux] psutil.net_connections() exceptions. (patch by Alexander Grothe) ``` ### 2.1.0 ``` ===== *2014-04-08* **Enhancements** - 387_: system-wide open connections a-la netstat. **Bug fixes** - 421_: [Solaris] psutil does not compile on SunOS 5.10 (patch by Naveed Roudsari) - 489_: [Linux] psutil.disk_partitions() return an empty list. ``` ### 2.0.0 ``` ===== *2014-03-10* **Enhancements** - 424_: [Windows] installer for Python 3.X 64 bit. - 427_: number of logical and physical CPUs (psutil.cpu_count()). - 447_: psutil.wait_procs() timeout parameter is now optional. - 452_: make Process instances hashable and usable with set()s. - 453_: tests on Python < 2.7 require unittest2 module. - 459_: add a make file for running tests and other repetitive tasks (also on Windows). - 463_: make timeout parameter of cpu_percent* functions default to 0.0 'cause it's a common trap to introduce slowdowns. - 468_: move documentation to readthedocs.com. - 477_: process cpu_percent() is about 30% faster. (suggested by crusaderky) - 478_: [Linux] almost all APIs are about 30% faster on Python 3.X. - 479_: long deprecated psutil.error module is gone; exception classes now live in "psutil" namespace only. **Bug fixes** - 193_: psutil.Popen constructor can throw an exception if the spawned process terminates quickly. - 340_: [Windows] process get_open_files() no longer hangs. (patch by jtangvahna.net) - 443_: [Linux] fix a potential overflow issue for Process.set_cpu_affinity() on systems with more than 64 CPUs. - 448_: [Windows] get_children() and ppid() memory leak (patch by Ulrich Klank). - 457_: [POSIX] pid_exists() always returns True for PID 0. - 461_: namedtuples are not pickle-able. - 466_: [Linux] process exe improper null bytes handling. (patch by Gautam Singh) - 470_: wait_procs() might not wait. (patch by crusaderky) - 471_: [Windows] process exe improper unicode handling. (patch by alexmroja.net) - 473_: psutil.Popen.wait() does not set returncode attribute. - 474_: [Windows] Process.cpu_percent() is no longer capped at 100%. - 476_: [Linux] encoding error for process name and cmdline. **API changes** For the sake of consistency a lot of psutil APIs have been renamed. In most cases accessing the old names will work but it will cause a DeprecationWarning. - psutil.* module level constants have being replaced by functions: +-----------------------+-------------------------------+ | Old name | Replacement | +=======================+===============================+ | psutil.NUM_CPUS | psutil.cpu_cpunt() | +-----------------------+-------------------------------+ | psutil.BOOT_TIME | psutil.boot_time() | +-----------------------+-------------------------------+ | psutil.TOTAL_PHYMEM | psutil.virtual_memory().total | +-----------------------+-------------------------------+ - Renamed psutil.* functions: +--------------------------+-------------------------------+ | Old name | Replacement | +==========================+===============================+ | - psutil.get_pid_list() | psutil.pids() | +--------------------------+-------------------------------+ | - psutil.get_users() | psutil.users() | +--------------------------+-------------------------------+ | - psutil.get_boot_time() | psutil.boot_time() | +--------------------------+-------------------------------+ - All psutil.Process ``get_*`` methods lost the ``get_`` prefix. get_ext_memory_info() renamed to memory_info_ex(). Assuming "p = psutil.Process()": +--------------------------+----------------------+ | Old name | Replacement | +==========================+======================+ | p.get_children() | p.children() | +--------------------------+----------------------+ | p.get_connections() | p.connections() | +--------------------------+----------------------+ | p.get_cpu_affinity() | p.cpu_affinity() | +--------------------------+----------------------+ | p.get_cpu_percent() | p.cpu_percent() | +--------------------------+----------------------+ | p.get_cpu_times() | p.cpu_times() | +--------------------------+----------------------+ | p.get_ext_memory_info() | p.memory_info_ex() | +--------------------------+----------------------+ | p.get_io_counters() | p.io_counters() | +--------------------------+----------------------+ | p.get_ionice() | p.ionice() | +--------------------------+----------------------+ | p.get_memory_info() | p.memory_info() | +--------------------------+----------------------+ | p.get_memory_maps() | p.memory_maps() | +--------------------------+----------------------+ | p.get_memory_percent() | p.memory_percent() | +--------------------------+----------------------+ | p.get_nice() | p.nice() | +--------------------------+----------------------+ | p.get_num_ctx_switches() | p.num_ctx_switches() | +--------------------------+----------------------+ | p.get_num_fds() | p.num_fds() | +--------------------------+----------------------+ | p.get_num_threads() | p.num_threads() | +--------------------------+----------------------+ | p.get_open_files() | p.open_files() | +--------------------------+----------------------+ | p.get_rlimit() | p.rlimit() | +--------------------------+----------------------+ | p.get_threads() | p.threads() | +--------------------------+----------------------+ | p.getcwd() | p.cwd() | +--------------------------+----------------------+ - All psutil.Process ``set_*`` methods lost the ``set_`` prefix. Assuming "p = psutil.Process()": +----------------------+---------------------------------+ | Old name | Replacement | +======================+=================================+ | p.set_nice() | p.nice(value) | +----------------------+---------------------------------+ | p.set_ionice() | p.ionice(ioclass, value=None) | +----------------------+---------------------------------+ | p.set_cpu_affinity() | p.cpu_affinity(cpus) | +----------------------+---------------------------------+ | p.set_rlimit() | p.rlimit(resource, limits=None) | +----------------------+---------------------------------+ - Except for 'pid' all psutil.Process class properties have been turned into methods. This is the only case which there are no aliases. Assuming "p = psutil.Process()": +---------------+-----------------+ | Old name | Replacement | +===============+=================+ | p.name | p.name() | +---------------+-----------------+ | p.parent | p.parent() | +---------------+-----------------+ | p.ppid | p.ppid() | +---------------+-----------------+ | p.exe | p.exe() | +---------------+-----------------+ | p.cmdline | p.cmdline() | +---------------+-----------------+ | p.status | p.status() | +---------------+-----------------+ | p.uids | p.uids() | +---------------+-----------------+ | p.gids | p.gids() | +---------------+-----------------+ | p.username | p.username() | +---------------+-----------------+ | p.create_time | p.create_time() | +---------------+-----------------+ - timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1. - long deprecated psutil.error module is gone; exception classes now live in "psutil" namespace only. - Process instances' "retcode" attribute returned by psutil.wait_procs() has been renamed to "returncode" for consistency with subprocess.Popen. ``` ### 1.2.1 ``` ===== *2013-11-25* **Bug fixes** - 348_: [Windows XP] fixed "ImportError: DLL load failed" occurring on module import. - 425_: [Solaris] crash on import due to failure at determining BOOT_TIME. - 443_: [Linux] can't set CPU affinity on systems with more than 64 cores. ``` ### 1.2.0 ``` ===== *2013-11-20* **Enhancements** - 439_: assume os.getpid() if no argument is passed to psutil.Process constructor. - 440_: new psutil.wait_procs() utility function which waits for multiple processes to terminate. **Bug fixes** - 348_: [Windows XP/Vista] fix "ImportError: DLL load failed" occurring on module import. ``` ### 1.1.3 ``` ===== *2013-11-07* **Bug fixes** - 442_: [Linux] psutil won't compile on certain version of Linux because of missing prlimit(2) syscall. ``` ### 1.1.2 ``` ===== *2013-10-22* **Bug fixes** - 442_: [Linux] psutil won't compile on Debian 6.0 because of missing prlimit(2) syscall. ``` ### 1.1.1 ``` ===== *2013-10-08* **Bug fixes** - 442_: [Linux] psutil won't compile on kernels < 2.6.36 due to missing prlimit(2) syscall. ``` ### 1.1.0 ``` ===== *2013-09-28* **Enhancements** - 410_: host tar.gz and windows binary files are on PYPI. - 412_: [Linux] get/set process resource limits. - 415_: [Windows] Process.get_children() is an order of magnitude faster. - 426_: [Windows] Process.name is an order of magnitude faster. - 431_: [UNIX] Process.name is slightly faster because it unnecessarily retrieved also process cmdline. **Bug fixes** - 391_: [Windows] psutil.cpu_times_percent() returns negative percentages. - 408_: STATUS_* and CONN_* constants don't properly serialize on JSON. - 411_: [Windows] examples/disk_usage.py may pop-up a GUI error. - 413_: [Windows] Process.get_memory_info() leaks memory. - 414_: [Windows] Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER. - 416_: psutil.disk_usage() doesn't work well with unicode path names. - 430_: [Linux] process IO counters report wrong number of r/w syscalls. - 435_: [Linux] psutil.net_io_counters() might report erreneous NIC names. - 436_: [Linux] psutil.net_io_counters() reports a wrong 'dropin' value. **API changes** - 408_: turn STATUS_* and CONN_* constants into plain Python strings. ``` ### 1.0.1 ``` ===== *2013-07-12* **Bug fixes** - 405_: network_io_counters(pernic=True) no longer works as intended in 1.0.0. ``` ### 1.0.0 ``` ===== *2013-07-10* **Enhancements** - 18_: Solaris support (yay!) (thanks Justin Venus) - 367_: Process.get_connections() 'status' strings are now constants. - 380_: test suite exits with non-zero on failure. (patch by floppymaster) - 391_: introduce unittest2 facilities and provide workarounds if unittest2 is not installed (python < 2.7). **Bug fixes** - 374_: [Windows] negative memory usage reported if process uses a lot of memory. - 379_: [Linux] Process.get_memory_maps() may raise ValueError. - 394_: [OSX] Mapped memory regions report incorrect file name. - 404_: [Linux] sched_*affinity() are implicitly declared. (patch by Arfrever) **API changes** - Process.get_connections() 'status' field is no longer a string but a constant object (psutil.CONN_*). - Process.get_connections() 'local_address' and 'remote_address' fields renamed to 'laddr' and 'raddr'. - psutil.network_io_counters() renamed to psutil.net_io_counters(). ``` ### 0.7.1 ``` ===== *2013-05-03* **Bug fixes** - 325_: [BSD] psutil.virtual_memory() can raise SystemError. (patch by Jan Beich) - 370_: [BSD] Process.get_connections() requires root. (patch by John Baldwin) - 372_: [BSD] different process methods raise NoSuchProcess instead of AccessDenied. ``` ### 0.7.0 ``` ===== *2013-04-12* **Enhancements** - 233_: code migrated to Mercurial (yay!) - 246_: psutil.error module is deprecated and scheduled for removal. - 328_: [Windows] process IO nice/priority support. - 359_: psutil.get_boot_time() - 361_: [Linux] psutil.cpu_times() now includes new 'steal', 'guest' and 'guest_nice' fields available on recent Linux kernels. Also, psutil.cpu_percent() is more accurate. - 362_: cpu_times_percent() (per-CPU-time utilization as a percentage) **Bug fixes** - 234_: [Windows] disk_io_counters() fails to list certain disks. - 264_: [Windows] use of psutil.disk_partitions() may cause a message box to appear. - 313_: [Linux] psutil.virtual_memory() and psutil.swap_memory() can crash on certain exotic Linux flavors having an incomplete /proc interface. If that's the case we now set the unretrievable stats to 0 and raise a RuntimeWarning. - 315_: [OSX] fix some compilation warnings. - 317_: [Windows] cannot set process CPU affinity above 31 cores. - 319_: [Linux] process get_memory_maps() raises KeyError 'Anonymous' on Debian squeeze. - 321_: [UNIX] Process.ppid property is no longer cached as the kernel may set the ppid to 1 in case of a zombie process. - 323_: [OSX] disk_io_counters()'s read_time and write_time parameters were reporting microseconds not milliseconds. (patch by Gregory Szorc) - 331_: Process cmdline is no longer cached after first acces as it may change. - 333_: [OSX] Leak of Mach ports on OS X (patch by rsesekgoogle.com) - 337_: [Linux] process methods not working because of a poor /proc implementation will raise NotImplementedError rather than RuntimeError and Process.as_dict() will not blow up. (patch by Curtin1060) - 338_: [Linux] disk_io_counters() fails to find some disks. - 339_: [FreeBSD] get_pid_list() can allocate all the memory on system. - 341_: [Linux] psutil might crash on import due to error in retrieving system terminals map. - 344_: [FreeBSD] swap_memory() might return incorrect results due to kvm_open(3) not being called. (patch by Jean Sebastien) - 338_: [Linux] disk_io_counters() fails to find some disks. - 351_: [Windows] if psutil is compiled with mingw32 (provided installers for py2.4 and py2.5 are) disk_io_counters() will fail. (Patch by m.malycha) - 353_: [OSX] get_users() returns an empty list on OSX 10.8. - 356_: Process.parent now checks whether parent PID has been reused in which case returns None. - 365_: Process.set_nice() should check PID has not been reused by another process. - 366_: [FreeBSD] get_memory_maps(), get_num_fds(), get_open_files() and getcwd() Process methods raise RuntimeError instead of AccessDenied. **API changes** - Process.cmdline property is no longer cached after first access. - Process.ppid property is no longer cached after first access. - [Linux] Process methods not working because of a poor /proc implementation will raise NotImplementedError instead of RuntimeError. - psutil.error module is deprecated and scheduled for removal. ``` ### 0.6.1 ``` ===== *2012-08-16* **Enhancements** - 316_: process cmdline property now makes a better job at guessing the process executable from the cmdline. **Bug fixes** - 316_: process exe was resolved in case it was a symlink. - 318_: python 2.4 compatibility was broken. **API changes** - process exe can now return an empty string instead of raising AccessDenied. - process exe is no longer resolved in case it's a symlink. ``` ### 0.6.0 ``` ===== *2012-08-13* **Enhancements** - 216_: [POSIX] get_connections() UNIX sockets support. - 220_: [FreeBSD] get_connections() has been rewritten in C and no longer requires lsof. - 222_: [OSX] add support for process cwd. - 261_: process extended memory info. - 295_: [OSX] process executable path is now determined by asking the OS instead of being guessed from process cmdline. - 297_: [OSX] the Process methods below were always raising AccessDenied for any process except the current one. Now this is no longer true. Also they are 2.5x faster. - name - get_memory_info() - get_memory_percent() - get_cpu_times() - get_cpu_percent() - get_num_threads() - 300_: examples/pmap.py script. - 301_: process_iter() now yields processes sorted by their PIDs. - 302_: process number of voluntary and involuntary context switches. - 303_: [Windows] the Process methods below were always raising AccessDenied for any process not owned by current user. Now this is no longer true: - create_time - get_cpu_times() - get_cpu_percent() - get_memory_info() - get_memory_percent() - get_num_handles() - get_io_counters() - 305_: add examples/netstat.py script. - 311_: system memory functions has been refactorized and rewritten and now provide a more detailed and consistent representation of the system memory. New psutil.virtual_memory() function provides the following memory amounts: - total - available - percent - used - active [POSIX] - inactive [POSIX] - buffers (BSD, Linux) - cached (BSD, OSX) - wired (OSX, BSD) - shared [FreeBSD] New psutil.swap_memory() provides: - total - used - free - percent - sin (no. of bytes the system has swapped in from disk (cumulative)) - sout (no. of bytes the system has swapped out from disk (cumulative)) All old memory-related functions are deprecated. Also two new example scripts were added: free.py and meminfo.py. - 312_: psutil.network_io_counters() namedtuple includes 4 new fields: errin, errout dropin and dropout, reflecting the number of packets dropped and with errors. **Bug fixes** - 298_: [OSX and BSD] memory leak in get_num_fds(). - 299_: potential memory leak every time PyList_New(0) is used. - 303_: [Windows] potential heap corruption in get_num_threads() and get_status() Process methods. - 305_: [FreeBSD] psutil can't compile on FreeBSD 9 due to removal of utmp.h. - 306_: at C level, errors are not checked when invoking Py* functions which create or manipulate Python objects leading to potential memory related errors and/or segmentation faults. - 307_: [FreeBSD] values returned by psutil.network_io_counters() are wrong. - 308_: [BSD / Windows] psutil.virtmem_usage() wasn't actually returning information about swap memory usage as it was supposed to do. It does now. - 309_: get_open_files() might not return files which can not be accessed due to limited permissions. AccessDenied is now raised instead. **API changes** - psutil.phymem_usage() is deprecated (use psutil.virtual_memory()) - psutil.virtmem_usage() is deprecated (use psutil.swap_memory()) - psutil.phymem_buffers() on Linux is deprecated (use psutil.virtual_memory()) - psutil.cached_phymem() on Linux is deprecated (use psutil.virtual_memory()) - [Windows and BSD] psutil.virtmem_usage() now returns information about swap memory instead of virtual memory. ``` ### 0.5.1 ``` ===== *2012-06-29* **Enhancements** - 293_: [Windows] process executable path is now determined by asking the OS instead of being guessed from process cmdline. **Bug fixes** - 292_: [Linux] race condition in process files/threads/connections. - 294_: [Windows] Process CPU affinity is only able to set CPU 0. ``` ### 0.5.0 ``` ===== *2012-06-27* **Enhancements** - 195_: [Windows] number of handles opened by process. - 209_: psutil.disk_partitions() now provides also mount options. - 229_: list users currently connected on the system (psutil.get_users()). - 238_: [Linux, Windows] process CPU affinity (get and set). - 242_: Process.get_children(recursive=True): return all process descendants. - 245_: [POSIX] Process.wait() incrementally consumes less CPU cycles. - 257_: [Windows] removed Windows 2000 support. - 258_: [Linux] Process.get_memory_info() is now 0.5x faster. - 260_: process's mapped memory regions. (Windows patch by wj32.64, OSX patch by Jeremy Whitlock) - 262_: [Windows] psutil.disk_partitions() was slow due to inspecting the floppy disk drive also when "all" argument was False. - 273_: psutil.get_process_list() is deprecated. - 274_: psutil no longer requires 2to3 at installation time in order to work with Python 3. - 278_: new Process.as_dict() method. - 281_: ppid, name, exe, cmdline and create_time properties of Process class are now cached after being accessed. - 282_: psutil.STATUS_* constants can now be compared by using their string representation. - 283_: speedup Process.is_running() by caching its return value in case the process is terminated. - 284_: [POSIX] per-process number of opened file descriptors. - 287_: psutil.process_iter() now caches Process instances between calls. - 290_: Process.nice property is deprecated in favor of new get_nice() and set_nice() methods. **Bug fixes** - 193_: psutil.Popen constructor can throw an exception if the spawned process terminates quickly. - 240_: [OSX] incorrect use of free() for Process.get_connections(). - 244_: [POSIX] Process.wait() can hog CPU resources if called against a process which is not our children. - 248_: [Linux] psutil.network_io_counters() might return erroneous NIC names. - 252_: [Windows] process getcwd() erroneously raise NoSuchProcess for processes owned by another user. It now raises AccessDenied instead. - 266_: [Windows] psutil.get_pid_list() only shows 1024 processes. (patch by Amoser) - 267_: [OSX] Process.get_connections() - an erroneous remote address was returned. (Patch by Amoser) - 272_: [Linux] Porcess.get_open_files() - potential race condition can lead to unexpected NoSuchProcess exception. Also, we can get incorrect reports of not absolutized path names. - 275_: [Linux] Process.get_io_counters() erroneously raise NoSuchProcess on old Linux versions. Where not available it now raises NotImplementedError. - 286_: Process.is_running() doesn't actually check whether PID has been reused. - 314_: Process.get_children() can sometimes return non-children. **API changes** - Process.nice property is deprecated in favor of new get_nice() and set_nice() methods. - psutil.get_process_list() is deprecated. - ppid, name, exe, cmdline and create_time properties of Process class are now cached after being accessed, meaning NoSuchProcess will no longer be raised in case the process is gone in the meantime. - psutil.STATUS_* constants can now be compared by using their string representation. ``` ### 0.4.1 ``` ===== *2011-12-14* **Bug fixes** - 228_: some example scripts were not working with python 3. - 230_: [Windows / OSX] memory leak in Process.get_connections(). - 232_: [Linux] psutil.phymem_usage() can report erroneous values which are different than "free" command. - 236_: [Windows] memory/handle leak in Process's get_memory_info(), suspend() and resume() methods. ``` ### 0.4.0 ``` ===== *2011-10-29* **Enhancements** - 150_: network I/O counters. (OSX and Windows patch by Jeremy Whitlock) - 154_: [FreeBSD] add support for process getcwd() - 157_: [Windows] provide installer for Python 3.2 64-bit. - 198_: Process.wait(timeout=0) can now be used to make wait() return immediately. - 206_: disk I/O counters. (OSX and Windows patch by Jeremy Whitlock) - 213_: examples/iotop.py script. - 217_: Process.get_connections() now has a "kind" argument to filter for connections with different criteria. - 221_: [FreeBSD] Process.get_open_files has been rewritten in C and no longer relies on lsof. - 223_: examples/top.py script. - 227_: examples/nettop.py script. **Bug fixes** - 135_: [OSX] psutil cannot create Process object. - 144_: [Linux] no longer support 0 special PID. - 188_: [Linux] psutil import error on Linux ARM architectures. - 194_: [POSIX] psutil.Process.get_cpu_percent() now reports a percentage over 100 on multicore processors. - 197_: [Linux] Process.get_connections() is broken on platforms not supporting IPv6. - 200_: [Linux] psutil.NUM_CPUS not working on armel and sparc architectures and causing crash on module import. - 201_: [Linux] Process.get_connections() is broken on big-endian architectures. - 211_: Process instance can unexpectedly raise NoSuchProcess if tested for equality with another object. - 218_: [Linux] crash at import time on Debian 64-bit because of a missing line in /proc/meminfo. - 226_: [FreeBSD] crash at import time on FreeBSD 7 and minor. ``` ### 0.3.0 ``` ===== *2011-07-08* **Enhancements** - 125_: system per-cpu percentage utilization and times. - 163_: per-process associated terminal (TTY). - 171_: added get_phymem() and get_virtmem() functions returning system memory information (total, used, free) and memory percent usage. total_* avail_* and used_* memory functions are deprecated. - 172_: disk usage statistics. - 174_: mounted disk partitions. - 179_: setuptools is now used in setup.py **Bug fixes** - 159_: SetSeDebug() does not close handles or unset impersonation on return. - 164_: [Windows] wait function raises a TimeoutException when a process returns -1 . - 165_: process.status raises an unhandled exception. - 166_: get_memory_info() leaks handles hogging system resources. - 168_: psutil.cpu_percent() returns erroneous results when used in non-blocking mode. (patch by Philip Roberts) - 178_: OSX - Process.get_threads() leaks memory - 180_: [Windows] Process's get_num_threads() and get_threads() methods can raise NoSuchProcess exception while process still exists. ``` ### 0.2.1 ``` ===== *2011-03-20* **Enhancements** - 64_: per-process I/O counters. - 116_: per-process wait() (wait for process to terminate and return its exit code). - 134_: per-process get_threads() returning information (id, user and kernel times) about threads opened by process. - 136_: process executable path on FreeBSD is now determined by asking the kernel instead of guessing it from cmdline[0]. - 137_: per-process real, effective and saved user and group ids. - 140_: system boot time. - 142_: per-process get and set niceness (priority). - 143_: per-process status. - 147_: per-process I/O nice (priority) - Linux only. - 148_: psutil.Popen class which tidies up subprocess.Popen and psutil.Process in a unique interface. - 152_: [OSX] get_process_open_files() implementation has been rewritten in C and no longer relies on lsof resulting in a 3x speedup. - 153_: [OSX] get_process_connection() implementation has been rewritten in C and no longer relies on lsof resulting in a 3x speedup. **Bug fixes** - 83_: process cmdline is empty on OSX 64-bit. - 130_: a race condition can cause IOError exception be raised on Linux if process disappears between open() and subsequent read() calls. - 145_: WindowsError was raised instead of psutil.AccessDenied when using process resume() or suspend() on Windows. - 146_: 'exe' property on Linux can raise TypeError if path contains NULL bytes. - 151_: exe and getcwd() for PID 0 on Linux return inconsistent data. **API changes** - Process "uid" and "gid" properties are deprecated in favor of "uids" and "gids" properties. ``` ### 0.2.0 ``` ===== *2010-11-13* **Enhancements** - 79_: per-process open files. - 88_: total system physical cached memory. - 88_: total system physical memory buffers used by the kernel. - 91_: per-process send_signal() and terminate() methods. - 95_: NoSuchProcess and AccessDenied exception classes now provide "pid", "name" and "msg" attributes. - 97_: per-process children. - 98_: Process.get_cpu_times() and Process.get_memory_info now return a namedtuple instead of a tuple. - 103_: per-process opened TCP and UDP connections. - 107_: add support for Windows 64 bit. (patch by cjgohlke) - 111_: per-process executable name. - 113_: exception messages now include process name and pid. - 114_: process username Windows implementation has been rewritten in pure C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no longer required as a third-party dependancy. (patch by wj32) - 117_: added support for Windows 2000. - 123_: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a new 'interval' parameter. - 129_: per-process number of threads. **Bug fixes** - 80_: fixed warnings when installing psutil with easy_install. - 81_: psutil fails to compile with Visual Studio. - 94_: suspend() raises OSError instead of AccessDenied. - 86_: psutil didn't compile against FreeBSD 6.x. - 102_: orphaned process handles obtained by using OpenProcess in C were left behind every time Process class was instantiated. - 111_: path and name Process properties report truncated or erroneous values on UNIX. - 120_: cpu_percent() always returning 100% on OS X. - 112_: uid and gid properties don't change if process changes effective user/group id at some point. - 126_: ppid, uid, gid, name, exe, cmdline and create_time properties are no longer cached and correctly raise NoSuchProcess exception if the process disappears. **API changes** - psutil.Process.path property is deprecated and works as an alias for "exe" property. - psutil.Process.kill(): signal argument was removed - to send a signal to the process use send_signal(signal) method instead. - psutil.Process.get_memory_info() returns a nametuple instead of a tuple. - psutil.cpu_times() returns a nametuple instead of a tuple. - New psutil.Process methods: get_open_files(), get_connections(), send_signal() and terminate(). - ppid, uid, gid, name, exe, cmdline and create_time properties are no longer cached and raise NoSuchProcess exception if process disappears. - psutil.cpu_percent() no longer returns immediately (see issue 123). - psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns immediately by default (see issue 123). ``` ### 0.1.3 ``` ===== *2010-03-02* **Enhancements** - 14_: per-process username - 51_: per-process current working directory (Windows and Linux only) - 59_: Process.is_running() is now 10 times faster - 61_: added supoprt for FreeBSD 64 bit - 71_: implemented suspend/resume process - 75_: python 3 support **Bug fixes** - 36_: process cpu_times() and memory_info() functions succeeded also for dead processes while a NoSuchProcess exception is supposed to be raised. - 48_: incorrect size for mib array defined in getcmdargs for BSD - 49_: possible memory leak due to missing free() on error condition on - 50_: fixed getcmdargs() memory fragmentation on BSD - 55_: test_pid_4 was failing on Windows Vista - 57_: some unit tests were failing on systems where no swap memory is available - 58_: is_running() is now called before kill() to make sure we are going to kill the correct process. - 73_: virtual memory size reported on OS X includes shared library size - 77_: NoSuchProcess wasn't raised on Process.create_time if kill() was used first. ``` ### 0.1.2 ``` ===== *2009-05-06* **Enhancements** - 32_: Per-process CPU user/kernel times - 33_: Process create time - 34_: Per-process CPU utilization percentage - 38_: Per-process memory usage (bytes) - 41_: Per-process memory utilization (percent) - 39_: System uptime - 43_: Total system virtual memory - 46_: Total system physical memory - 44_: Total system used/free virtual and physical memory **Bug fixes** - 36_: [Windows] NoSuchProcess not raised when accessing timing methods. - 40_: test_get_cpu_times() failing on FreeBSD and OS X. - 42_: [Windows] get_memory_percent() raises AccessDenied. ``` ### 0.1.1 ``` ===== *2009-03-06* **Enhancements** - 4_: FreeBSD support for all functions of psutil - 9_: Process.uid and Process.gid now retrieve process UID and GID. - 11_: Support for parent/ppid - Process.parent property returns a Process object representing the parent process, and Process.ppid returns the parent PID. - 12_ & 15: NoSuchProcess exception now raised when creating an object for a nonexistent process, or when retrieving information about a process that has gone away. - 21_: AccessDenied exception created for raising access denied errors from OSError or WindowsError on individual platforms. - 26_: psutil.process_iter() function to iterate over processes as Process objects with a generator. - Process objects can now also be compared with == operator for equality (PID, name, command line are compared). **Bug fixes** - 16_: [Windows] Special case for "System Idle Process" (PID 0) which otherwise would return an "invalid parameter" exception. - 17_: get_process_list() ignores NoSuchProcess and AccessDenied exceptions during building of the list. - 22_: [Windows] Process(0).kill() was failing with an unset exception. - 23_: Special case for pid_exists(0) - 24_: [Windows] Process(0).kill() now raises AccessDenied exception instead of WindowsError. - 30_: psutil.get_pid_list() was returning two ins .. _1: https://github.com/giampaolo/psutil/issues/1 .. _2: https://github.com/giampaolo/psutil/issues/2 .. _3: https://github.com/giampaolo/psutil/issues/3 .. _4: https://github.com/giampaolo/psutil/issues/4 .. _5: https://github.com/giampaolo/psutil/issues/5 .. _6: https://github.com/giampaolo/psutil/issues/6 .. _7: https://github.com/giampaolo/psutil/issues/7 .. _8: https://github.com/giampaolo/psutil/issues/8 .. _9: https://github.com/giampaolo/psutil/issues/9 .. _10: https://github.com/giampaolo/psutil/issues/10 .. _11: https://github.com/giampaolo/psutil/issues/11 .. _12: https://github.com/giampaolo/psutil/issues/12 .. _13: https://github.com/giampaolo/psutil/issues/13 .. _14: https://github.com/giampaolo/psutil/issues/14 .. _15: http