NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #112 most downloaded on PyPI
Cross-platform lib for process and system monitoring.
Last release 8 months ago
28 Jan 2026
Release timing varies
gaps range from 2 weeks to 7 months
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
104 releases · first in 2013
795, [Windows]: new APIs to deal with Windows services: win_service_iter and win_service_get.
New APIs
795, [Windows]: new APIs to deal with Windows services: win_service_iter and win_service_get.
800, [Linux]: virtual_memory returns a new shared field.
Performance
819, [Linux]: speedup /proc parsing: Process.ppid +20% faster. Process.status +28% faster. Process.name +25% faster. Process.num_threads +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.
777, [Linux]: Process.open_files on Linux return 3 new fields: position, mode and flags.
New APIs
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 macOS and Windows).
789, [Windows]: cpu_times return two new fields: interrupt and dpc. Same for cpu_times_percent.
792: new cpu_stats function returning number of CPU ctx_switches, interrupts, soft_interrupts and syscalls.
Bug fixes
780, [macOS], build-fail: psutil does not compile with some GCC versions.
790, [macOS], build-fail: psutil won't compile on macOS 10.4.
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)
786: net_if_addrs may report incomplete MAC addresses.
788, [NetBSD]: virtual_memory buffers and shared values were set to 0.
One column per quarter.
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 macOS and Windows).
789_, [Windows]: `cpu_times()`_ return two new fields: interrupt and dpc. Same for `cpu_times_percent()`_.
792_: new `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_, [macOS]: psutil does not compile with some GCC versions.
786_: `net_if_addrs()`_ may report incomplete MAC addresses.
788_, [NetBSD]: `virtual_memory()`_ buffers and shared values were set to 0.
790_, [macOS], [critical]: psutil won't compile on macOS 10.4.
523, [Linux], [FreeBSD]: disk_io_counters return a new busy_time field.
New APIs
523, [Linux], [FreeBSD]: disk_io_counters return a new busy_time field.
732: Process.environ. (patch by Frank Benkstein)
753, [Linux], [macOS], [Windows]: process USS and PSS (Linux) "real" memory stats. (patch by Eric Rahm)
755: Process.memory_percent memtype parameter.
760: expose OS constants (LINUX, OSX, etc.)
756, [Linux]: disk_io_counters return 2 new fields: read_merged_count and write_merged_count.
Build and packaging
660, [Windows]: make.bat is smarter in finding alternative VS install locations. (patch by mpderbec)
Internals
758: tests now live in psutil namespace.
762: add scripts/procsmem.py.
Bug fixes
751, [Linux], critical: fixed call to Py_DECREF on possible NULL object.
704, [SunOS], build-fail: psutil does not compile on Solaris sparc.
741, [OpenBSD], build-fail: psutil does not compile on mips64.
764, [NetBSD], build-fail: fix compilation on NetBSD-6.x.
685, [Linux]: virtual_memory provides wrong results on systems with a lot of physical memory.
734: on Python 3 invalid UTF-8 data is not correctly handled for Process.name, Process.cwd, Process.exe, Process.cmdline and Process.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, Process.cmdline and Process.cwd could return a wrong result or incorrectly report an AccessDenied error.
754, [Linux]: Process.cmdline can be wrong in case of zombie process.
759, [Linux]: Process.memory_maps may return paths ending with " (deleted)".
761, [Windows]: boot_time wraps to 0 after 49 days.
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.
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], [macOS], [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 `procsmem.py`_ script.
Bug fixes
685_, [Linux]: `virtual_memory()`_ provides wrong results on systems with a lot of physical memory.
704_, [SunOS]: psutil does not compile on Solaris sparc.
734_: on Python 3 invalid UTF-8 data is not correctly handled for `Process.name()`_, `Process.cwd()`_, `Process.exe()`_, `Process.cmdline()`_ and `Process.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, `Process.cmdline()`_ and `Process.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]: `Process.cmdline()`_ can be wrong in case of zombie process.
759_, [Linux]: `Process.memory_maps()`_ may return paths ending with " (deleted)".
761_, [Windows]: `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.
728, [SunOS]: exposed PROCFS_PATH constant to change the default location of /proc filesystem.
New APIs
728, [SunOS]: exposed PROCFS_PATH constant to change the default location of /proc filesystem.
Bug fixes
724, [FreeBSD]: virtual_memory total is incorrect.
730, [FreeBSD]: virtual_memory crashes with "OSError: [Errno 12] Cannot allocate memory".
2016-01-20
Enhancements
728_, [SunOS]: exposed `PROCFS_PATH`_ constant to change the default location of /proc filesystem.
Bug fixes
724_, [FreeBSD]: `virtual_memory()`_ total is incorrect.
730_, [FreeBSD], [critical]: `virtual_memory()`_ crashes with "OSError: [Errno 12] Cannot allocate memory".
557, [NetBSD]: added NetBSD support. (contributed by Ryo Onodera and Thomas Klausner)
New platforms
557, [NetBSD]: added NetBSD support. (contributed by Ryo Onodera and Thomas Klausner)
API changes
718: process_iter is now thread safe.
Performance
708, [Linux]: net_connections and Process.connections on Python 2 can be up to 3x faster in case of many connections. Also Process.memory_maps is slightly faster.
Bug fixes
715, critical: don't crash at import time if cpu_times fail for some reason.
714, [OpenBSD]: virtual_memory cached value was always set to 0.
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.
2016-01-15
Enhancements
557_, [NetBSD]: added NetBSD support. (contributed by Ryo Onodera and Thomas Klausner)
708_, [Linux]: `net_connections()`_ and `Process.connections()`_ on Python 2 can be up to 3x faster in case of many connections. Also `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_, [critical]: 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.
Nothing published for this version
558, [Linux]: exposed PROCFS_PATH constant to change the default location of /proc filesystem.
New APIs
558, [Linux]: exposed PROCFS_PATH constant to change the default location of /proc filesystem.
New platforms
615, [OpenBSD]: added OpenBSD support. (contributed by Landry Breuil)
Bug fixes
692, [POSIX]: Process.name is no longer cached as it may change.
2015-11-25
Enhancements
558_, [Linux]: exposed `PROCFS_PATH`_ constant to change the default location of /proc filesystem.
615_, [OpenBSD]: added OpenBSD support. (contributed by Landry Breuil)
Bug fixes
692_, [POSIX]: `Process.name()`_ is no longer cached as it may change.
610, [SunOS], build-fail: fix build and tests on Solaris 10
Bug fixes
610, [SunOS], build-fail: fix build and tests on Solaris 10
678, [Linux], build-fail: can't install psutil due to bug in setup.py.
688, [Windows], build-fail: compilation fails with MSVC 2015, Python 3.5. (patch by Mike Sarahan)
690, [Windows], build-fail: can't compile with MSVC 2015, which enforces the C++11 rule forbidding duplicate values in an unscoped enum.
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)
623, [Linux]: process or system connections raises ValueError if IPv6 is not supported by the system.
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], [critical]: can't install psutil due to bug in setup.py.
688_, [Windows]: compilation fails with MSVC 2015, Python 3.5. (patch by Mike Sarahan)
677, [Linux], build-fail: can't install psutil due to bug in setup.py.
Bug fixes
677, [Linux], build-fail: can't install psutil due to bug in setup.py.
2015-09-03
Bug fixes
677_, [Linux], [critical]: can't install psutil due to bug in setup.py.
644, [Windows]: added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals to use with Process.send_signal.
New APIs
644, [Windows]: added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals to use with Process.send_signal.
API changes
663, [POSIX]: net_if_addrs now returns point-to-point (VPNs) addresses.
655, [Windows]: fix various unicode handling issues. On Python 2, string APIs now return encoded strings using sys.getfilesystemencoding.
Internals
648, [macOS]: CI test integration. (patch by Jeff Tang)
Bug fixes
670, [Windows], critical: segfault of net_if_addrs in case of non-ASCII NIC names. (patch by sk6249)
659, [Linux], build-fail: compilation error on Suse 10. (patch by maozguttman)
664, [Linux], build-fail: compilation error on Alpine Linux. (patch by Bart van Kleef)
672, [Windows], build-fail: compilation fails if using Windows SDK v8.0. (patch by Steven Winfield)
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.
675, [Linux]: net_connections: UnicodeDecodeError may occur when listing UNIX sockets.
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 macOS. (patch by Jeff Tang)
663_, [POSIX]: `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: `net_if_addrs()`_, `net_if_stats()`_, `net_io_counters()`_, `Process.cmdline()`_, `Process.name()`_, `Process.username()`_, `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.
603, [Linux]: Process.ionice set value range is incorrect. (patch by spacewander )
Bug fixes
603, [Linux]: Process.ionice set value range is incorrect. (patch by spacewander)
645, [Linux]: cpu_times_percent may produce negative results.
656: from psutil import * does not work.
641, [Windows]: replace deprecated string functions with safe equivalents.
API changes
534, [Linux]: disk_partitions added support for ZFS filesystems.
Documentation
647: new dev guide: https://github.com/giampaolo/psutil/blob/master/docs/devguide.rst
Internals
646, [Windows]: continuous tests integration for Windows with https://ci.appveyor.com/project/giampaolo/psutil.
651: continuous code quality test integration with scrutinizer-ci.com
Bug fixes
340, [Windows], critical: Process.open_files no longer hangs (uses a thread with timeout). (patch by Jeff Tang)
627, [Windows]: Process.name no longer raises AccessDenied for pids owned by another user.
636, [Windows]: Process.memory_info raise AccessDenied.
5ae30c79, [POSIX]: raise exception if trying to send signal to PID 0 as it will affect os.getpid 's process group and not PID 0.
639, [Linux]: Process.cmdline can be truncated.
640, [Linux]: *connections functions may swallow errors and return an incomplete list of connections.
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.
2015-07-15
Enhancements
534_, [Linux]: `disk_partitions()`_ added support for ZFS filesystems.
646_, [Windows]: continuous tests integration for Windows with https://ci.appveyor.com/project/giampaolo/psutil.
647_: new dev guide: https://github.com/giampaolo/psutil/blob/master/docs/DEVGUIDE.rst
651_: continuous code quality test integration with scrutinizer-ci.com
Bug fixes
340_, [Windows], [critical]: `Process.open_files()`_ no longer hangs. Instead it uses a thread which times out and skips the file handle in case it's taking too long to be retrieved. (patch by Jeff Tang)
627_, [Windows]: `Process.name()`_ no longer raises `AccessDenied`_ for pids owned by another user.
636_, [Windows]: `Process.memory_info()`_ raise `AccessDenied`_.
637_, [POSIX]: raise exception if trying to send signal to PID 0 as it will affect os.getpid() 's process group and not PID 0.
639_, [Linux]: `Process.cmdline()`_ can be truncated.
640_, [Linux]: *connections functions may swallow errors and return an incomplete list of connections.
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.
635, [POSIX], critical: crash on module import if enum package is installed on Python < 3.4.
Bug fixes
635, [POSIX], critical: crash on module import if enum package is installed on Python < 3.4.
632, [Linux]: better error message if cannot parse process UNIX connections.
634, [Linux]: Process.cmdline does not include empty string arguments.
2015-06-18
Bug fixes
632_, [Linux]: better error message if cannot parse process UNIX connections.
634_, [Linux]: `Process.cmdline()`_ does not include empty string arguments.
635_, [POSIX], [critical]: crash on module import if enum package is installed on Python < 3.4.
594, breaking: all deprecated APIs were removed.
New APIs
250: new net_if_stats returning NIC statistics (isup, duplex, speed, mtu).
376: new net_if_addrs returning all NIC addresses a-la ifconfig.
API changes
594, breaking: all deprecated APIs were removed.
469: on Python >= 3.4 IOPRIO_CLASS_* and *_PRIORITY_CLASS constants returned by Process.ionice and Process.nice are enums instead of plain integers.
582: connection constants returned by net_connections and Process.connections were turned from int to enums on Python > 3.4.
589: Process.cpu_affinity accepts any kind of iterable (set, tuple, ...), not only lists.
599, [Windows]: Process.name can now be determined for all processes even when running as a limited user.
Build and packaging
587: move native extension into the package.
Internals
581: add .gitignore. (patch by Gabi Davar)
602: pre-commit GIT hook.
629: enhanced support for pytest and nose test runners.
616, [Windows]: add inet_ntop() function for Windows XP.
Bug fixes
512, [BSD], critical: fix segfault in net_connections.
586, [FreeBSD], critical: Process.cpu_affinity segfaults on set in case an invalid CPU number is provided.
593, [FreeBSD], critical: Process.memory_maps segfaults.
607, [Linux], build-fail: can't compile on old RedHat versions where DUPLEX_UNKNOWN is not defined.
428, [POSIX]: correct handling of zombie processes on POSIX. Introduced new ZombieProcess exception class.
555, [Linux]: users correctly handles ":0" as an alias for "localhost".
579, [Windows]: fixed Process.open_files for PID > 64K.
579, [Windows]: fixed many compiler warnings.
585, [FreeBSD]: net_connections may raise KeyError.
606: Process.parent may swallow NoSuchProcess exceptions.
611, [SunOS]: net_io_counters has send and received swapped
614, [Linux]:: cpu_count with logical=False return the number of sockets instead of cores.
618, [SunOS]: swap tests fail on Solaris when run as normal user.
628, [Linux]: Process.name truncates string in case it contains spaces or parentheses.
2015-06-13
Enhancements
250_: new `net_if_stats()`_ returning NIC statistics (isup, duplex, speed, mtu).
376_: new `net_if_addrs()`_ returning all NIC addresses a-la ifconfig.
469_: on Python >= 3.4 IOPRIO_CLASS_* and *_PRIORITY_CLASS constants returned by `Process.ionice()`_ and `Process.nice()`_ are enums instead of plain integers.
581_: add .gitignore. (patch by Gabi Davar)
582_: connection constants returned by `net_connections()`_ and `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 pytest and nose test runners.
616_, [Windows]: add inet_ntop() function for Windows XP.
Bug fixes
428_, [POSIX], [critical]: correct handling of zombie processes on POSIX. Introduced new `ZombieProcess`_ exception class.
512_, [BSD], [critical]: fix segfault in `net_connections()`_.
555_, [Linux]: `users()`_ correctly handles ":0" as an alias for "localhost".
579_, [Windows]: fixed `Process.open_files()`_ for PID > 64K.
579_, [Windows]: fixed many compiler warnings.
585_, [FreeBSD]: `net_connections()`_ may raise KeyError.
586_, [FreeBSD], [critical]: `Process.cpu_affinity()`_ segfaults on set in case an invalid CPU number is provided.
593_, [FreeBSD], [critical]: `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()`_ with logical=False return the number of sockets instead of cores.
618_, [SunOS]: swap tests fail on Solaris when run as normal user.
628_, [Linux]: `Process.name()`_ truncates string in case it contains spaces or parentheses.
572, [Linux]: fix "ValueError: ambiguous inode with multiple PIDs references" for Process.connections. (patch by Bruno Binet )
Bug fixes
572, [Linux]: fix "ValueError: ambiguous inode with multiple PIDs references" for Process.connections. (patch by Bruno Binet)
2015-02-02
Bug fixes
572_, [Linux]: fix "ValueError: ambiguous inode with multiple PIDs references" for `Process.connections()`_. (patch by Bruno Binet)
569, [FreeBSD]: add support for Process.cpu_affinity on FreeBSD.
New APIs
569, [FreeBSD]: add support for Process.cpu_affinity on FreeBSD.
Internals
553: add scripts/pstree.py.
568: add scripts/pidof.py.
Dropped support
521, breaking: drop support for Python 2.4 and 2.5.
Bug fixes
496, [SunOS], critical: can't import psutil.
556, [Linux], memleak: lots of file handles were left open.
569, [FreeBSD], memleak: fix memory leak in cpu_count with logical=False.
547, [POSIX]: 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.
561, [Linux]: net_connections might skip some legitimate UNIX sockets. (patch by spacewander)
564: C extension version mismatch is now detected at import time.
565, [Windows]: use proper encoding for Process.username and users. (patch by Sylvain Mouquet)
567, [Linux]: in the alternative implementation of Process.cpu_affinity PyList_Append and Py_BuildValue return values are not checked.
571, [Linux]: Process.open_files might swallow AccessDenied exceptions and return an incomplete list of open files.
2015-01-06
Enhancements
521_: drop support for Python 2.4 and 2.5.
553_: new `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 `pidof.py`_ script.
569_, [FreeBSD]: add support for `Process.cpu_affinity()`_ on FreeBSD.
Bug fixes
496_, [SunOS], [critical]: can't import psutil.
547_, [POSIX]: `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 `Process.username()`_ and `users()`_. (patch by Sylvain Mouquet)
567_, [Linux]: in the alternative implementation of `Process.cpu_affinity()`_ PyList_Append and Py_BuildValue return values are not checked.
569_, [FreeBSD]: fix memory leak in `cpu_count()`_ with logical=False.
571_, [Linux]: `Process.open_files()`_ might swallow `AccessDenied`_ exceptions and return an incomplete list of open files.
536, [Linux], build-fail: fix "undefined symbol: CPU_ALLOC" compilation error.
Bug fixes
536, [Linux], build-fail: fix "undefined symbol: CPU_ALLOC" compilation error.
2014-09-26
536_, [Linux], [critical]: fix "undefined symbol: CPU_ALLOC" compilation error.
505, [Windows]: distribution as wheel packages.
Build and packaging
505, [Windows]: distribution as wheel packages.
Internals
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)
511: add scripts/ps.py.
Bug fixes
340, [Windows], critical: Process.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, Process.open_files and Process.connections 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]: 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.
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_: add `ps.py`_ script.
Bug fixes
340_, [Windows]: `Process.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()`_, `Process.open_files()`_ and `Process.connections()`_ can raise OSError(ESRCH) instead of `NoSuchProcess`_.
504_, [Linux]: can't build RPM packages via setup.py
506_, [Linux], [critical]: 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]: `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.
446, [Windows]: fix encoding error when using net_io_counters on Python 3. (patch by Szigeti Gabor Niif )
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.
497, [Linux]: net_connections exceptions. (patch by Alexander Grothe)
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]: `net_connections()`_ exceptions. (patch by Alexander Grothe)
387: system-wide open connections a-la netstat (add net_connections).
New APIs
387: system-wide open connections a-la netstat (add net_connections).
Bug fixes
421, [SunOS], build-fail: psutil does not compile on SunOS 5.10. (patch by Naveed Roudsari)
489, [Linux]: disk_partitions return an empty list.
2014-04-08
Enhancements
387_: system-wide open connections a-la netstat (add `net_connections()`_).
Bug fixes
421_, [SunOS], [critical]: psutil does not compile on SunOS 5.10. (patch by Naveed Roudsari)
489_, [Linux]: `disk_partitions()`_ return an empty list.
In most cases accessing the old names will work but it will cause a DeprecationWarning.
New APIs
427: add cpu_count.
API changes
447: wait_procs timeout parameter is now optional.
452: make Process instances hashable and usable with set() s.
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_count() |
psutil.BOOT_TIME |
psutil.boot_time() |
psutil.TOTAL_PHYMEM |
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 Process get_* methods lost the get_ prefix. E.g. get_ext_memory_info() was 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 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 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() |
479, breaking: long deprecated psutil.error module is gone; exception classes now live in "psutil" namespace only.
463: timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1, avoiding a common source of accidental slowdowns.
Process instances' retcode attribute returned by wait_procs has been renamed to returncode for consistency with subprocess.Popen.
Performance
477: Process.cpu_percent is about 30% faster. (suggested by crusaderky)
478, [Linux]: almost all APIs are about 30% faster on Python 3.X.
Build and packaging
424, [Windows]: installer for Python 3.X 64 bit.
Documentation
468: move documentation to readthedocs.com.
Internals
453: tests on Python < 2.7 require unittest2 module.
459: add a Makefile for running tests and other repetitive tasks (also on Windows).
Bug fixes
340, [Windows], critical: Process.open_files no longer hangs. (patch by jtang@vahna.net)
448, [Windows], memleak: Process.children and Process.ppid memory leak (patch by Ulrich Klank).
193: Popen constructor can throw an exception if the spawned process terminates quickly.
443, [Linux]: fix a potential overflow issue for Process.cpu_affinity (set) on systems with more than 64 CPUs.
457, [POSIX]: pid_exists always returns True for PID 0.
461: named tuples 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: Popen wait() method does not set returncode attribute.
474, [Windows]: Process.cpu_percent is no longer capped at 100%.
476, [Linux]: encoding error for Process.name and Process.cmdline.
2014-03-10
Enhancements
424_, [Windows]: installer for Python 3.X 64 bit.
427_: number of logical CPUs and physical cores (`cpu_count()`_).
447_: `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 Makefile 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.open_files()`_ no longer hangs. (patch by jtang@vahna.net)
443_, [Linux]: fix a potential overflow issue for `Process.cpu_affinity()`_ (set) on systems with more than 64 CPUs.
448_, [Windows]: `Process.children()`_ and `Process.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() method does not set returncode attribute.
474_, [Windows]: `Process.cpu_percent()`_ is no longer capped at 100%.
476_, [Linux]: encoding error for `Process.name()`_ and `Process.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_count() |
psutil.BOOT_TIME |
psutil.boot_time() |
psutil.TOTAL_PHYMEM |
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 `Process`_ get_* methods lost the get_ prefix. E.g. get_ext_memory_info() was 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 `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 `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 `wait_procs()`_ has been renamed to returncode for consistency with subprocess.Popen.
348, [Windows], critical: fixed "ImportError: DLL load failed" occurring on module import on Windows XP.
Bug fixes
348, [Windows], critical: fixed "ImportError: DLL load failed" occurring on module import on Windows XP.
425, [SunOS], critical: crash on import due to failure at determining BOOT_TIME.
443, [Linux]: Process.cpu_affinity can't set affinity on systems with more than 64 cores.
440: new wait_procs utility function which waits for multiple processes to terminate.
New APIs
440: new wait_procs utility function which waits for multiple processes to terminate.
API changes
439: assume os.getpid if no argument is passed to Process class constructor.
Bug fixes
348, [Windows], critical: fix "ImportError: DLL load failed" occurring on module import on Windows XP / Vista.
2013-11-20
Enhancements
439_: assume os.getpid() if no argument is passed to `Process`_ class constructor.
440_: new `wait_procs()`_ utility function which waits for multiple processes to terminate.
Bug fixes
348_, [Windows]: fix "ImportError: DLL load failed" occurring on module import on Windows XP / Vista.
442, [Linux], build-fail: psutil won't compile on certain version of Linux because of missing prlimit(2) syscall.
Bug fixes
442, [Linux], build-fail: psutil won't compile on certain version of Linux because of missing prlimit(2) syscall.
2013-11-07
Bug fixes
442_, [Linux], [critical]: psutil won't compile on certain version of Linux because of missing prlimit(2) syscall.
442, [Linux], build-fail: psutil won't compile on Debian 6.0 because of missing prlimit(2) syscall.
Bug fixes
442, [Linux], build-fail: psutil won't compile on Debian 6.0 because of missing prlimit(2) syscall.
2013-10-22
Bug fixes
442_, [Linux], [critical]: psutil won't compile on Debian 6.0 because of missing prlimit(2) syscall.
442, [Linux], build-fail: psutil won't compile on kernels < 2.6.36 due to missing prlimit(2) syscall.
Bug fixes
442, [Linux], build-fail: psutil won't compile on kernels < 2.6.36 due to missing prlimit(2) syscall.
2013-10-08
Bug fixes
442_, [Linux], [critical]: psutil won't compile on kernels < 2.6.36 due to missing prlimit(2) syscall.
412, [Linux]: add Process.rlimit.
New APIs
412, [Linux]: add Process.rlimit.
API changes
408: turn STATUS_* and CONN_* constants into plain Python strings.
Performance
415, [Windows]: Process.children is an order of magnitude faster.
426, [Windows]: Process.name is an order of magnitude faster.
431, [POSIX]: Process.name is slightly faster because it unnecessarily retrieved also Process.cmdline.
Build and packaging
410: host tar.gz and Windows binary files are on PyPI.
Bug fixes
413, [Windows], memleak: Process.memory_info leaks memory.
392, [Windows]: cpu_times_percent returns negative percentages.
408: STATUS_* and CONN_* constants don't properly serialize on JSON.
411, [Windows]: scripts/disk_usage.py may pop-up a GUI error.
414, [Windows]: Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER.
416: disk_usage doesn't work well with unicode path names.
430, [Linux]: Process.io_counters report wrong number of r/w syscalls.
435, [Linux]: net_io_counters might report erreneous NIC names.
436, [Linux]: net_io_counters reports a wrong dropin value.
2013-09-28
Enhancements
410_: host tar.gz and Windows binary files are on PyPI.
412_, [Linux]: get/set process resource limits (`Process.rlimit()`_).
415_, [Windows]: `Process.children()`_ is an order of magnitude faster.
426_, [Windows]: `Process.name()`_ is an order of magnitude faster.
431_, [POSIX]: `Process.name()`_ is slightly faster because it unnecessarily retrieved also `Process.cmdline()`_.
Bug fixes
391_, [Windows]: `cpu_times_percent()`_ returns negative percentages.
408_: STATUS_* and CONN_* constants don't properly serialize on JSON.
411_, [Windows]: `disk_usage.py`_ may pop-up a GUI error.
413_, [Windows]: `Process.memory_info()`_ leaks memory.
414_, [Windows]: `Process.exe()`_ on Windows XP may raise ERROR_INVALID_PARAMETER.
416_: `disk_usage()`_ doesn't work well with unicode path names.
430_, [Linux]: `Process.io_counters()`_ report wrong number of r/w syscalls.
435_, [Linux]: `net_io_counters()`_ might report erreneous NIC names.
436_, [Linux]: `net_io_counters()`_ reports a wrong dropin value.
API changes
408_: turn STATUS_* and CONN_* constants into plain Python strings.
405: net_io_counters pernic=True no longer works as intended in 1.0.0.
Bug fixes
405: net_io_counters pernic=True no longer works as intended in 1.0.0.
2013-07-12
Bug fixes
405_: `net_io_counters()`_ pernic=True no longer works as intended in 1.0.0.
18, [SunOS]: add Solaris support (yay!) (thanks Justin Venus)
New platforms
18, [SunOS]: add Solaris support (yay!) (thanks Justin Venus)
API changes
367: Process.connections status is no longer a string but a constant object (psutil.CONN_*).
Process.connections local_address and remote_address fields renamed to laddr and raddr.
psutil.network_io_counters() renamed to net_io_counters.
Internals
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
404, [Linux], build-fail: sched_*affinity() are implicitly declared. (patch by Arfrever)
374, [Windows]: negative memory usage reported if process uses a lot of memory.
379, [Linux]: Process.memory_maps may raise ValueError.
394, [macOS]: mapped memory regions of Process.memory_maps report incorrect file name.
2013-07-10
Enhancements
18_, [SunOS]: add Solaris support (yay!) (thanks Justin Venus)
367_: `Process.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.memory_maps()`_ may raise ValueError.
394_, [macOS]: mapped memory regions of `Process.memory_maps()`_ report incorrect file name.
404_, [Linux]: sched_*affinity() are implicitly declared. (patch by Arfrever)
API changes
`Process.connections()`_ status field is no longer a string but a constant object (psutil.CONN_*).
`Process.connections()`_ local_address and remote_address fields renamed to laddr and raddr.
psutil.network_io_counters() renamed to `net_io_counters()`_.
325, [BSD]: virtual_memory can raise SystemError. (patch by Jan Beich )
Bug fixes
325, [BSD]: virtual_memory can raise SystemError. (patch by Jan Beich)
370, [BSD]: Process.connections requires root. (patch by John Baldwin)
372, [BSD]: different process methods raise NoSuchProcess instead of AccessDenied.
2013-05-03
Bug fixes
325_, [BSD], [critical]: `virtual_memory()`_ can raise SystemError. (patch by Jan Beich)
370_, [BSD]: `Process.connections()`_ requires root. (patch by John Baldwin)
372_, [BSD]: different process methods raise `NoSuchProcess`_ instead of `AccessDenied`_.
246: psutil.error module is deprecated and scheduled for removal.
New APIs
328, [Windows]: Process.ionice support.
359: add boot_time as a substitute of psutil.BOOT_TIME since the latter cannot reflect system clock updates.
361, [Linux]: cpu_times now includes new steal, guest and guest_nice fields available on recent Linux kernels. Also, cpu_percent is more accurate.
362: add cpu_times_percent (per-CPU-time utilization as a percentage).
API changes
246: psutil.error module is deprecated and scheduled for removal.
Internals
233: code migrated to Mercurial (yay!)
Bug fixes
313, [Linux], critical: virtual_memory and 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 RuntimeWarning instead.
341, [Linux], critical: psutil might crash on import due to error in retrieving system terminals map.
333, [macOS], memleak: leak of Mach ports (patch by rsesek)
339, [FreeBSD], memleak: get_pid_list() can allocate all the memory on system.
234, [Windows]: disk_io_counters fails to list certain disks.
264, [Windows]: use of disk_partitions may cause a message box to appear.
315, [macOS]: fix some compilation warnings.
317, [Windows]: cannot set process CPU affinity above 31 cores.
319, [Linux]: Process.memory_maps raises KeyError 'Anonymous' on Debian squeeze.
321, [POSIX]: Process.ppid property is no longer cached as the kernel may set the PPID to 1 in case of a zombie process.
323, [macOS]: disk_io_counters read_time and write_time parameters were reporting microseconds not milliseconds. (patch by Gregory Szorc)
331: Process.cmdline is no longer cached after first access as it may change.
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.
344, [FreeBSD]: swap_memory might return incorrect results due to kvm_open(3) not being called. (patch by Jean Sebastien)
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, [macOS]: users returns an empty list on macOS 10.8.
356: Process.parent now checks whether parent PID has been reused in which case returns None.
365: Process.nice (set) should check PID has not been reused by another process.
366, [FreeBSD]: Process.memory_maps, Process.num_fds, Process.open_files and Process.cwd methods raise RuntimeError instead of AccessDenied.
2013-04-12
Enhancements
233_: code migrated to Mercurial (yay!)
246_: psutil.error module is deprecated and scheduled for removal.
328_, [Windows]: `Process.ionice()`_ support.
359_: add `boot_time()`_ as a substitute of psutil.BOOT_TIME since the latter cannot reflect system clock updates.
361_, [Linux]: `cpu_times()`_ now includes new steal, guest and guest_nice fields available on recent Linux kernels. Also, `cpu_percent()`_ is more accurate.
362_: add `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 `disk_partitions()`_ may cause a message box to appear.
313_, [Linux], [critical]: `virtual_memory()`_ and `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 RuntimeWarning instead.
315_, [macOS]: fix some compilation warnings.
317_, [Windows]: cannot set process CPU affinity above 31 cores.
319_, [Linux]: `Process.memory_maps()`_ raises KeyError 'Anonymous' on Debian squeeze.
321_, [POSIX]: `Process.ppid()`_ property is no longer cached as the kernel may set the PPID to 1 in case of a zombie process.
323_, [macOS]: `disk_io_counters()`_ read_time and write_time parameters were reporting microseconds not milliseconds. (patch by Gregory Szorc)
331_: `Process.cmdline()`_ is no longer cached after first access as it may change.
333_, [macOS]: leak of Mach ports (patch by rsesek@google.com)
337_, [Linux], [critical]: `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], [critical]: 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_, [macOS]: `users()`_ returns an empty list on macOS 10.8.
356_: `Process.parent()`_ now checks whether parent PID has been reused in which case returns None.
365_: `Process.nice()`_ (set) should check PID has not been reused by another process.
366_, [FreeBSD], [critical]: `Process.memory_maps()`_, `Process.num_fds()`_, `Process.open_files()`_ and `Process.cwd()`_ 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.
316: Process.cmdline property now makes a better job at guessing the process executable from the cmdline.
API changes
316: Process.cmdline property now makes a better job at guessing the process executable from the cmdline.
Process.exe can now return an empty string instead of raising AccessDenied.
Bug fixes
316: Process.exe was resolved in case it was a symlink.
318: Python 2.4 compatibility was broken.
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_, [critical]: 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.
311: add virtual_memory and swap_memory. Old memory-related functions are deprecated. New example scripts: scripts/free.py and scripts/meminfo.py.
New APIs
216, [POSIX]: add Process.connections UNIX sockets support.
222, [macOS]: add support for Process.cwd.
261: add Process.memory_info_ex().
302: add Process.num_ctx_switches.
311: add virtual_memory and swap_memory. Old memory-related functions are deprecated. New example scripts: scripts/free.py and scripts/meminfo.py.
312: net_io_counters adds 4 new fields: errin, errout, dropin and dropout.
API changes
295, [macOS]: Process.exe path is now determined by asking the OS instead of being guessed from Process.cmdline.
297, [macOS]: Process.name, Process.memory_info, Process.memory_percent, Process.cpu_times, Process.cpu_percent, Process.num_threads no longer raise AccessDenied for other users' processes and are 2.5x faster.
301: process_iter now yields processes sorted by their PIDs.
304, [Windows]: Process.create_time, Process.cpu_times, Process.cpu_percent, Process.memory_info, Process.memory_percent, Process.num_handles, Process.io_counters no longer raise AccessDenied for other users' processes.
psutil.phymem_usage() is deprecated (use virtual_memory)
psutil.virtmem_usage() is deprecated (use swap_memory)
[Linux]: psutil.phymem_buffers() is deprecated (use virtual_memory)
[Linux]: psutil.cached_phymem() is deprecated (use virtual_memory)
Performance
220, [FreeBSD]: net_connections has been rewritten in C and no longer requires lsof.
Internals
300: add scripts/pmap.py.
6e45ac1a: add scripts/netstat.py.
Bug fixes
303, [Windows], critical: potential heap corruption in Process.num_threads and Process.status methods.
306, critical: 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.
305, [FreeBSD], build-fail: can't compile on FreeBSD 9 due to removal of utmp.h.
298, [macOS], [BSD], memleak: memory leak in Process.num_fds.
299, memleak: potential memory leak every time PyList_New(0) is used.
307, [FreeBSD]: values returned by net_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.
310: Process.open_files might not return files which can not be accessed due to limited permissions. AccessDenied is now raised instead.
2012-08-13
Enhancements
216_, [POSIX]: `Process.connections()`_ UNIX sockets support.
220_, [FreeBSD]: get_connections() has been rewritten in C and no longer requires lsof.
222_, [macOS]: add support for `Process.cwd()`_.
261_: per-process extended memory info (`Process.memory_info_ex()`_).
295_, [macOS]: `Process.exe()`_ path is now determined by asking the OS instead of being guessed from `Process.cmdline()`_.
297_, [macOS]: 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. `Process.name()`_, `Process.memory_info()`_, `Process.memory_percent()`_, `Process.cpu_times()`_, `Process.cpu_percent()`_, `Process.num_threads()`_.
300_: add `pmap.py`_ script.
301_: `process_iter()`_ now yields processes sorted by their PIDs.
302_: per-process number of voluntary and involuntary context switches (`Process.num_ctx_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: `Process.create_time()`_, `Process.cpu_times()`_, `Process.cpu_percent()`_, `Process.memory_info()`_, `Process.memory_percent()`_, `Process.num_handles()`_, `Process.io_counters()`_.
305_: add `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. Added new `virtual_memory()`_ and `swap_memory()`_ functions. All old memory-related functions are deprecated. Also two new example scripts were added: `free.py`_ and `meminfo.py`_.
312_: net_io_counters() namedtuple includes 4 new fields: errin, errout, dropin and dropout, reflecting the number of packets dropped and with errors.
Bug fixes
298_, [macOS], [BSD]: memory leak in `Process.num_fds()`_.
299_: potential memory leak every time PyList_New(0) is used.
303_, [Windows], [critical]: potential heap corruption in `Process.num_threads()`_ and `Process.status()`_ methods.
305_, [FreeBSD], [critical]: can't compile on FreeBSD 9 due to removal of utmp.h.
306_, [critical]: 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 `net_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_: `Process.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 `virtual_memory()`_)
psutil.virtmem_usage() is deprecated (use `swap_memory()`_)
[Linux]: psutil.phymem_buffers() is deprecated (use `virtual_memory()`_)
[Linux]: psutil.cached_phymem() is deprecated (use `virtual_memory()`_)
[Windows], [BSD]: psutil.virtmem_usage() now returns information about swap memory instead of virtual memory.
293, [Windows]: Process.exe path is now determined by asking the OS instead of being guessed from Process.cmdline.
API changes
293, [Windows]: Process.exe path is now determined by asking the OS instead of being guessed from Process.cmdline.
Bug fixes
292, [Linux]: race condition in process Process.open_files, Process.connections, Process.threads.
294, [Windows]: Process.cpu_affinity is only able to set CPU #0.
273: psutil.get_process_list() is deprecated.
New APIs
195, [Windows]: add Process.num_handles.
209: disk_partitions now provides also mount options.
229: add users.
238, [Linux], [Windows]: add Process.cpu_affinity.
242: add recursive=True to Process.children: return all process descendants.
260: add Process.memory_maps. (Windows patch by wj32, macOS patch by Jeremy Whitlock)
278: add Process.as_dict.
284, [POSIX]: add Process.num_fds.
API changes
273: psutil.get_process_list() is deprecated.
281: Process.ppid, Process.name, Process.exe, Process.cmdline and Process.create_time are now cached after first access, so NoSuchProcess is no longer raised if the process is gone in the meantime.
282: psutil.STATUS_* constants can now be compared by using their string representation.
290: Process.nice property is deprecated in favor of new get_nice() and set_nice() methods.
Performance
245, [POSIX]: Process.wait incrementally consumes less CPU cycles.
258, [Linux]: Process.memory_info is now 0.5x faster.
262, [Windows]: disk_partitions was slow due to inspecting the floppy disk drive also when parameter is all=False.
283: speedup Process.is_running by caching its return value in case the process is terminated.
287: process_iter now caches Process instances between calls.
Build and packaging
274: psutil no longer requires 2to3 at installation time in order to work with Python 3.
Dropped support
257, [Windows], breaking: removed Windows 2000 support.
Bug fixes
240, [macOS], critical: incorrect use of free() for Process.connections.
193: Popen constructor can throw an exception if the spawned process terminates quickly.
244, [POSIX]: Process.wait can hog CPU resources if called against a process which is not our children.
248, [Linux]: net_io_counters might return erroneous NIC names.
252, [Windows]: Process.cwd 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, [macOS]: Process.connections returns wrong remote address. (Patch by Amoser)
272, [Linux]: Process.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.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.children can sometimes return non-children.
2012-06-27
Enhancements
195_, [Windows]: number of handles opened by process (`Process.num_handles()`_).
209_: `disk_partitions()`_ now provides also mount options.
229_: list users currently connected on the system (`users()`_).
238_, [Linux], [Windows]: process CPU affinity (get and set, `Process.cpu_affinity()`_).
242_: add recursive=True to `Process.children()`_: return all process descendants.
245_, [POSIX]: `Process.wait()`_ incrementally consumes less CPU cycles.
257_, [Windows]: removed Windows 2000 support.
258_, [Linux]: `Process.memory_info()`_ is now 0.5x faster.
260_: process's mapped memory regions. (Windows patch by wj32.64, macOS patch by Jeremy Whitlock)
262_, [Windows]: `disk_partitions()`_ was slow due to inspecting the floppy disk drive also when parameter is all=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_: `Process.ppid()`_, `Process.name()`_, `Process.exe()`_, `Process.cmdline()`_ and `Process.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 (`Process.num_fds()`_).
287_: `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_, [macOS]: incorrect use of free() for `Process.connections()`_.
244_, [POSIX]: `Process.wait()`_ can hog CPU resources if called against a process which is not our children.
248_, [Linux]: `net_io_counters()`_ might return erroneous NIC names.
252_, [Windows]: `Process.cwd()`_ 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_, [macOS]: `Process.connections()`_ returns wrong remote address. (Patch by Amoser)
272_, [Linux]: `Process.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.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.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.
`Process.ppid()`_, `Process.name()`_, `Process.exe()`_, `Process.cmdline()`_ and `Process.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.
230, [Windows], [macOS], memleak: fix memory leak in Process.connections.
Bug fixes
230, [Windows], [macOS], memleak: fix memory leak in Process.connections.
236, [Windows], memleak: fix memory/handle leak in Process.memory_info, Process.suspend and Process.resume methods.
228: some example scripts were not working with Python 3.
232, [Linux]: psutil.phymem_usage() can report erroneous values which are different than free command.
2011-12-14
Bug fixes
228_: some example scripts were not working with Python 3.
230_, [Windows], [macOS]: fix memory leak in `Process.connections()`_.
232_, [Linux]: psutil.phymem_usage() can report erroneous values which are different than free command.
236_, [Windows]: fix memory/handle leak in `Process.memory_info()`_, `Process.suspend()`_ and `Process.resume()`_ methods.
150: add net_io_counters (macOS and Windows patch by Jeremy Whitlock )
New APIs
150: add net_io_counters (macOS and Windows patch by Jeremy Whitlock)
154, [FreeBSD]: add support for Process.cwd.
206: add disk_io_counters). (macOS and Windows patch by Jeremy Whitlock)
217: Process.connections now has a kind argument to filter for connections with different criteria.
API changes
198: Process.wait with timeout=0 can now be used to make the function return immediately.
Performance
221, [FreeBSD]: Process.open_files has been rewritten in C and no longer relies on lsof.
Build and packaging
157, [Windows]: provide installer for Python 3.2 64-bit.
Internals
213: add scripts/iotop.py.
223: add scripts/top.py.
227: add scripts/nettop.py.
Bug fixes
188, [Linux], critical: psutil import error on Linux ARM architectures.
200, [Linux], critical: psutil.NUM_CPUS not working on armel and sparc architectures and causing crash on module import.
218, [Linux], critical: crash at import time on Debian 64-bit because of a missing line in /proc/meminfo.
226, [FreeBSD], critical: crash at import time on FreeBSD 7 and minor.
135, [macOS]: psutil cannot create Process object.
144, [Linux]: no longer support 0 special PID.
194, [POSIX]: Process.cpu_percent now reports a percentage over 100 on multi core processors.
197, [Linux]: Process.connections is broken on platforms not supporting IPv6.
201, [Linux]: Process.connections is broken on big-endian architectures.
211: Process instance can unexpectedly raise NoSuchProcess if tested for equality with another object.
2011-10-29
Enhancements
150_: network I/O counters (`net_io_counters()`_). (macOS and Windows patch by Jeremy Whitlock)
154_, [FreeBSD]: add support for `Process.cwd()`_.
157_, [Windows]: provide installer for Python 3.2 64-bit.
198_: `Process.wait()`_ with timeout=0 can now be used to make the function return immediately.
206_: disk I/O counters (`disk_io_counters()`_). (macOS and Windows patch by Jeremy Whitlock)
213_: add `iotop.py`_ script.
217_: `Process.connections()`_ now has a kind argument to filter for connections with different criteria.
221_, [FreeBSD]: `Process.open_files()`_ has been rewritten in C and no longer relies on lsof.
223_: add `top.py`_ script.
227_: add `nettop.py`_ script.
Bug fixes
135_, [macOS]: psutil cannot create `Process`_ object.
144_, [Linux]: no longer support 0 special PID.
188_, [Linux]: psutil import error on Linux ARM architectures.
194_, [POSIX]: `Process.cpu_percent()`_ now reports a percentage over 100 on multicore processors.
197_, [Linux]: `Process.connections()`_ is broken on platforms not supporting IPv6.
200_, [Linux], [critical]: psutil.NUM_CPUS not working on armel and sparc architectures and causing crash on module import.
201_, [Linux]: `Process.connections()`_ is broken on big-endian architectures.
211_: `Process`_ instance can unexpectedly raise `NoSuchProcess`_ if tested for equality with another object.
218_, [Linux], [critical]: crash at import time on Debian 64-bit because of a missing line in /proc/meminfo.
226_, [FreeBSD], [critical]: crash at import time on FreeBSD 7 and minor.
171: add get_phymem() and get_virtmem(). Old total_*, avail_* and used_* memory functions are deprecated.
New APIs
125: add cpu_times and cpu_percent per-cpu support.
163: add Process.terminal.
171: add get_phymem() and get_virtmem(). Old total_*, avail_* and used_* memory functions are deprecated.
172: add disk_usage.
174: add disk_partitions.
Build and packaging
179: setuptools is now used in setup.py
Bug fixes
159, [Windows], memleak: SetSeDebug() does not close handles or unset impersonation on return.
166, memleak: Process.memory_info leaks handles hogging system resources.
178, [macOS], memleak: Process.threads leaks memory.
164, [Windows]: Process.wait raises a TimeoutException when a process returns -1.
165: Process.status raises an unhandled exception.
168: cpu_percent returns erroneous results when used in non-blocking mode. (patch by Philip Roberts)
180, [Windows]: Process.num_threads and Process.threads methods can raise NoSuchProcess exception while process still exists.
2011-07-08
Enhancements
125_: system per-cpu percentage utilization and times (`Process.cpu_times()`_, `Process.cpu_percent()`_).
163_: per-process associated terminal / TTY (`Process.terminal()`_).
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 (`disk_usage()`_).
174_: mounted disk partitions (`disk_partitions()`_).
179_: setuptools is now used in setup.py
Bug fixes
159_, [Windows]: 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_: `Process.memory_info()`_ leaks handles hogging system resources.
168_: `cpu_percent()`_ returns erroneous results when used in non-blocking mode. (patch by Philip Roberts)
178_, [macOS]: `Process.threads()`_ leaks memory.
180_, [Windows]: `Process.num_threads()`_ and `Process.threads()`_ methods can raise `NoSuchProcess`_ exception while process still exists.
Process uid and gid properties are deprecated in favor of uids and gids properties.
New APIs
64: add Process.io_counters.
116: add Process.wait.
134: add Process.threads.
137: add Process.uids and Process.gids.
140: add boot_time.
142: add Process.nice.
143: add Process.status.
147, [Linux]: add Process.ionice.
148: add Popen class combining subprocess.Popen and Process in a single interface.
API changes
136, [FreeBSD]: Process.exe path is now determined by asking the kernel instead of guessing it from cmdline[0].
Process uid and gid properties are deprecated in favor of uids and gids properties.
Performance
152, [macOS]: Process.open_files rewritten in C (no longer relies on lsof, 3x faster).
153, [macOS]: Process.connections rewritten in C (no longer relies on lsof, 3x faster).
Bug fixes
83, [macOS]: Process.cmdline is empty on macOS 64-bit.
130, [Linux]: a race condition can cause IOError exception be raised on if process disappears between open() and the subsequent read() call.
145, [Windows]: WindowsError was raised instead of AccessDenied when using Process.resume or Process.suspend.
146, [Linux]: Process.exe property can raise TypeError if path contains NULL bytes.
151, [Linux]: Process.exe and Process.cwd for PID 0 return inconsistent data.
2011-03-20
Enhancements
64_: per-process I/O counters (`Process.io_counters()`_).
116_: per-process `Process.wait()`_ (wait for process to terminate and return its exit code).
134_: per-process threads (`Process.threads()`_).
136_: `Process.exe()`_ 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 (`Process.gids()`_).
140_: system boot time (`boot_time()`_).
142_: per-process get and set niceness (priority) (`Process.nice()`_).
143_: per-process status (`Process.status()`_).
147_ [Linux]: per-process I/O niceness / priority (`Process.ionice()`_).
148_: `psutil.Popen`_ class which tidies up subprocess.Popen and `Process`_ class in a single interface.
152_, [macOS]: `Process.open_files()`_ implementation has been rewritten in C and no longer relies on lsof resulting in a 3x speedup.
153_, [macOS]: `Process.connections()`_ implementation has been rewritten in C and no longer relies on lsof resulting in a 3x speedup.
Bug fixes
83_, [macOS]: `Process.cmdline()`_ is empty on macOS 64-bit.
130_, [Linux]: a race condition can cause IOError exception be raised on if process disappears between open() and the subsequent read() call.
145_, [Windows], [critical]: WindowsError was raised instead of `AccessDenied`_ when using `Process.resume()`_ or `Process.suspend()`_.
146_, [Linux]: `Process.exe()`_ property can raise TypeError if path contains NULL bytes.
151_, [Linux]: `Process.exe()`_ and `Process.cwd()`_ for PID 0 return inconsistent data.
API changes
`Process`_ uid and gid properties are deprecated in favor of uids and gids properties.
psutil.Process.path property is deprecated and works as an alias for psutil.Process.exe property.
New APIs
79: add Process.open_files.
88: total system physical cached memory.
88: total system physical memory buffers used by the kernel.
91: add Process.send_signal and Process.terminate methods.
95: NoSuchProcess and AccessDenied exception classes now provide pid, name and msg attributes.
97: add Process.children.
103: add Process.connections.
111: add Process.exe.
123: cpu_percent and Process.cpu_percent accept a new interval parameter.
129: add Process.threads.
New platforms
107, [Windows]: add support for Windows 64 bit. (patch by cjgohlke)
117, [Windows]: added support for Windows 2000.
API changes
98: Process.cpu_times and Process.memory_info now return a named tuple instead of a tuple.
113: exception messages now include Process.name and Process.pid.
psutil.Process.path property is deprecated and works as an alias for psutil.Process.exe property.
Process.kill: signal argument was removed - to send a signal to the process use Process.send_signal method instead.
cpu_times returns a named tuple instead of a tuple.
Process.cpu_percent and cpu_percent no longer returns immediately by default (see 123).
Performance
114, [Windows]: Process.username rewritten in C (no longer uses WMI, much faster, pywin32 no longer required). (patch by wj32)
Bug fixes
81, [Windows], build-fail: psutil fails to compile with Visual Studio.
86, [FreeBSD], build-fail: psutil didn't compile against FreeBSD 6.x.
102, [Windows], memleak: orphaned process handles obtained by using OpenProcess in C were left behind every time Process class was instantiated.
80: fixed warnings when installing psutil with easy_install.
94: Process.suspend raises OSError instead of AccessDenied.
111, [POSIX]: path and name Process properties report truncated or erroneous values on POSIX.
120, [macOS]: cpu_percent always returning 100%.
112: uid and gid properties don't change if process changes effective user/group id at some point.
126: Process.ppid, Process.uids, Process.gids, Process.name, Process.exe, Process.cmdline and Process.create_time properties are no longer cached and correctly raise NoSuchProcess exception if the process disappears.
2010-11-13
Enhancements
79_: per-process open files (`Process.open_files()`_).
88_: total system physical cached memory.
88_: total system physical memory buffers used by the kernel.
91_: add `Process.send_signal()`_ and `Process.terminate()`_ methods.
95_: `NoSuchProcess`_ and `AccessDenied`_ exception classes now provide pid, name and msg attributes.
97_: per-process children (`Process.children()`_).
98_: `Process.cpu_times()`_ and `Process.memory_info()`_ now return a namedtuple instead of a tuple.
103_: per-process opened TCP and UDP connections (`Process.connections()`_).
107_, [Windows]: add support for Windows 64 bit. (patch by cjgohlke)
111_: per-process executable name (`Process.exe()`_).
113_: exception messages now include `Process.name()`_ and `Process.pid`_.
114_, [Windows]: `Process.username()`_ 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 dependency. (patch by wj32)
117_, [Windows]: added support for Windows 2000.
123_: `cpu_percent()`_ and `Process.cpu_percent()`_ accept a new interval parameter.
129_: per-process threads (`Process.threads()`_).
Bug fixes
80_: fixed warnings when installing psutil with easy_install.
81_, [Windows]: psutil fails to compile with Visual Studio.
94_: `Process.suspend()`_ raises OSError instead of `AccessDenied`_.
86_, [FreeBSD]: psutil didn't compile against FreeBSD 6.x.
102_, [Windows]: orphaned process handles obtained by using OpenProcess in C were left behind every time `Process`_ class was instantiated.
111_, [POSIX]: path and name `Process`_ properties report truncated or erroneous values on POSIX.
120_, [macOS]: `cpu_percent()`_ always returning 100%.
112_: uid and gid properties don't change if process changes effective user/group id at some point.
126_: `Process.ppid()`_, `Process.uids()`_, `Process.gids()`_, `Process.name()`_, `Process.exe()`_, `Process.cmdline()`_ and `Process.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 psutil.Process.exe property.
`Process.kill()`_: signal argument was removed - to send a signal to the process use `Process.send_signal()`_ method instead.
`Process.memory_info()`_ returns a nametuple instead of a tuple.
`cpu_times()`_ returns a nametuple instead of a tuple.
New `Process`_ methods: `Process.open_files()`_, `Process.connections()`_, `Process.send_signal()`_ and `Process.terminate()`_.
`Process.ppid()`_, `Process.uids()`_, `Process.gids()`_, `Process.name()`_, `Process.exe()`_, `Process.cmdline()`_ and `Process.create_time()`_ properties are no longer cached and raise `NoSuchProcess`_ exception if process disappears.
`cpu_percent()`_ no longer returns immediately (see issue 123).
`Process.cpu_percent()`_ and `cpu_percent()`_ no longer returns immediately by default (see issue 123_).
51, [Linux], [Windows]: add Process.cwd.
New APIs
14: Process.username.
51, [Linux], [Windows]: add Process.cwd.
71: add Process.suspend and Process.resume.
New platforms
61, [FreeBSD]: added support for FreeBSD 64 bit.
75: Python 3 support.
Performance
59: Process.is_running is now 10 times faster.
Bug fixes
49, [FreeBSD], memleak: possible memory leak due to missing free() on error condition in getcmdpath().
62, [Windows], memleak: Process.cwd leaked a string object on every call.
36: Process.cpu_times and Process.memory_info functions succeeded. also for dead processes while a NoSuchProcess exception is supposed to be raised.
48, [FreeBSD]: incorrect size for MIB array defined in getcmdargs.
50, [macOS]: fixed getcmdargs() memory fragmentation.
55, [Windows]: test_pid_4 was failing on Windows Vista.
57: some unit tests were failing on systems where no swap memory is available.
58: Process.is_running is now called before Process.kill to make sure we are going to kill the correct process.
73, [macOS]: virtual memory size reported on includes shared library size.
77: NoSuchProcess wasn't raised on Process.create_time if Process.kill was used first.
2010-03-02
Enhancements
14_: `Process.username()`_.
51_, [Linux], [Windows]: per-process current working directory (`Process.cwd()`_).
59_: `Process.is_running()`_ is now 10 times faster.
61_, [FreeBSD]: added supoprt for FreeBSD 64 bit.
71_: per-process suspend and resume (`Process.suspend()`_ and `Process.resume()`_).
75_: Python 3 support.
Bug fixes
36_: `Process.cpu_times()`_ and `Process.memory_info()`_ functions succeeded. also for dead processes while a `NoSuchProcess`_ exception is supposed to be raised.
48_, [FreeBSD]: incorrect size for MIB array defined in getcmdargs.
49_, [FreeBSD]: possible memory leak due to missing free() on error condition in getcmdpath().
50_, [BSD]: fixed getcmdargs() memory fragmentation.
55_, [Windows]: test_pid_4 was failing on Windows Vista.
57_: some unit tests were failing on systems where no swap memory is available.
58_: `Process.is_running()`_ is now called before `Process.kill()`_ to make sure we are going to kill the correct process.
73_, [macOS]: virtual memory size reported on includes shared library size.
77_: `NoSuchProcess`_ wasn't raised on `Process.create_time()`_ if `Process.kill()`_ was used first.
41: add Process.memory_percent.
New APIs
32: add Process.cpu_times.
33: add Process.create_time.
34: add Process.cpu_percent.
38: add Process.memory_info.
41: add Process.memory_percent.
39: add boot_time.
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, [FreeBSD], [macOS]: fix test_get_cpu_times failures.
42, [Windows]: Process.memory_percent raises AccessDenied.
2009-05-06
Enhancements
32_: Per-process CPU user/kernel times (`Process.cpu_times()`_).
33_: Per-process create time (`Process.create_time()`_).
34_: Per-process CPU utilization percentage (`Process.cpu_percent()`_).
38_: Per-process memory usage (bytes) (`Process.memory_info()`_).
41_: Per-process memory percent (`Process.memory_percent()`_).
39_: System uptime (`boot_time()`_).
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_, [FreeBSD], [macOS]: fix test_get_cpu_times failures.
42_, [Windows]: `Process.memory_percent()`_ raises `AccessDenied`_.
9, [macOS], [Windows]: add Process.uid and Process.gid, returning process UID and GID.
New APIs
9, [macOS], [Windows]: add Process.uid and Process.gid, returning process UID and GID.
11: per-process parent object: Process.parent property returns a Process object representing the parent process, and Process.ppid returns the parent PID.
21, [Windows]: AccessDenied exception created for raising access denied errors from OSError or WindowsError on individual platforms.
26: process_iter function to iterate over processes as Process objects with a generator.
New platforms
4, [FreeBSD]: support for all functions of psutil.
API changes
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.
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.kill for PID 0 was failing with an unset exception.
23, [Linux], [macOS]: create special case for pid_exists with PID 0.
24, [Windows]: Process.kill for PID 0 now raises AccessDenied exception instead of WindowsError.
30: psutil.get_pid_list() was returning two 0 PIDs.
2009-03-06
Enhancements
4, [FreeBSD]: support for all functions of psutil.
9, [macOS], [Windows]: add Process.uid and Process.gid, returning process UID and GID.
11: per-process parent object: 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, [Windows]: AccessDenied exception created for raising access denied errors from OSError or WindowsError on individual platforms.
26: 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.kill() for PID 0 was failing with an unset exception.
23, [Linux], [macOS]: create special case for pid_exists() with PID 0.
24, [Windows], [critical]: Process.kill() for PID 0 now raises AccessDenied exception instead of WindowsError.
30: psutil.get_pid_list() was returning two 0 PIDs.
Initial release. Supports Linux, Windows, and macOS via per-platform backends (_pslinux, _psmswindows, _psosx) with C extensions for Windows and macOS
Initial release. Supports Linux, Windows, and macOS via per-platform backends (_pslinux, _psmswindows, _psosx) with C extensions for Windows and macOS.
New APIs
Process class exposing pid, name, path, and cmdline, with a kill() method.
get_process_list() returning all running processes.
ProcessInfo value object passed between the public API and the platform backends.
Your coding agent can read these notes before it upgrades. Set up the MCP server →