5.6.2
**Enhancements**
- 604_: [UNIX, Windows] add new psutil.getloadavg() returning system load
- 1404_: [Linux] cpu_count(logical=False) uses a second method (read from
/sys/devices/system/cpu/cpu[0-9]/topology/core_id) in order to determine
the number of physical CPUs in case /proc/cpuinfo does not provide this info.
- 1458_: provide coloured test output. Also show failures on KeyboardInterrupt.
- 1464_: various docfixes (always point to python3 doc, fix links, etc.).
- 1473_: [Windows] process IO priority (ionice()) values are now exposed as 4
new constants: IOPRIO_VERYLOW, IOPRIO_LOW, IOPRIO_NORMAL, IOPRIO_HIGH.
Also it was not possible to set high I/O priority (not it is).
- 1478_: add make command to re-run tests failed on last run.
average calculation.
**Bug fixes**
- 1223_: [Windows] boot_time() may return value on Windows XP.
- 1456_: [Linux] cpu_freq() returns None instead of 0.0 when min/max not
available
- 1462_: [Linux] (tests) make tests invariant to LANG setting
- 1463_: cpu_distribution.py script was broken.
- 1470_: [Linux] disk_partitions(): fix corner case when /etc/mtab doesn't
exist.
- 1471_: [SunOS] Process name() and cmdline() can return SystemError.
- 1472_: [Linux] cpu_freq() does not return all CPUs on Rasbperry pi 3.
- 1474_: fix formatting of psutil.tests() which mimicks 'ps aux' output.
- 1475_: [Windows] OSError.winerror attribute wasn't properly checked resuling
in WindowsError being raised instead of AccessDenied.
- 1477_: [Windows] wrong or absent error handling for private NTSTATUS Windows
APIs. Different process methods were affected by this.
- 1480_: [Windows] psutil.cpu_count(logical=False) could cause a crash due to
fixed read violation.
- 1486_: [AIX, SunOS] AttributeError when interacting with Process methods
involved into oneshot() context.
- 1491_: [SunOS] net_if_addrs(): free() ifap struct on error.
- 1493_: [Linux] cpu_freq(): handle the case where
/sys/devices/system/cpu/cpufreq/ exists but is empty.
5.5.1
Enhancements
- [Windows] on Windows >= 8.1 if Process.cmdline() fails due to
ERROR_ACCESS_DENIED attempt using NtQueryInformationProcess +
ProcessCommandLineInformation. (patch by EccoTheFlintstone)
Bug fixes
- [Windows] Process.exe() returns "[Error 0] The operation completed
successfully" when Python process runs in "Virtual Secure Mode".
- psutil exceptions' repr() show the internal private module path.
- [AIX] psutil won't compile on AIX 7.1 due to missing header.
Enhancements since 5.2.2:
- disk_io_counters() and net_io_counters() numbers no longer wrap
(restart from 0). Introduced a new "nowrap" argument.
- psutil.net_connections() and psutil.Process.connections() "laddr"
and "raddr" are now named tuples.
- 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.
- psutil.users() provides a new "pid" field.
- 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.
- implemented full unicode support.
- disk_usage() on Python 3 is now able to accept bytes.
- test suite now enables all warnings by default.
- source distribution is dynamically generated so that it only
includes relevant files.
- introduced PSUTIL_DEBUG environment variable which can be set in
order to print useful debug messages on stderr (useful in case of
nasty errors).
- added support for sensors_battery() on OSX.
- Process.children() is 2x faster on UNIX and 2.4x faster on Linux.
- deprecated method Process.memory_info_ex() now warns by using
FutureWarning instead of DeprecationWarning.
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.
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.
* Add preliminary NetBSD support code.
It is sufficient to run letsencrypt python client on NetBSD.
Changelog:
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
https://scrutinizer-ci.com/g/giampaolo/psutil/
**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.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
jtang@vahna.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
alex@mroja.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() |
---------------------------------
* Others:
* 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] fixed "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.
util is a module providing an interface for retrieving information,
on all running processes and system utilization (CPU, memory, disks,
network, users) in a portable way by using Python, implementing
many functionalities offered by command line tools such as ps, top,
df, netstat, who, kill, uptime, free, lsof, ifconfig, nice, ionice,
iostat, iotop, pidof, tty, taskset, or pmap.
Ported to NetBSD by tron & myself, but more work to do.