Changelog

8.0.0 (IN DEVELOPMENT)

Note

psutil 8.0 introduces breaking API changes. See the migration guide if upgrading from 7.x.

New APIs

Reorganization of process memory APIs (#2731, #2736, #2733, #2988).

Type hints and enums

  • #2753, breaking: Introduce enum classes (ProcessStatus, ConnectionStatus, ProcessIOPriority, ProcessPriority, ProcessRlimit) grouping related constants. The top-level constants (e.g. STATUS_RUNNING) remain the primary API, and are now aliases for the corresponding enum members. See migration guide.

  • #1946: Add inline type hints to all public APIs in psutil/__init__.py. Editors and checkers that read inline annotations (pyright, Pylance) pick them up automatically. mypy ignores them until we ship a py.typed marker, so it still relies on the third-party types-psutil stubs. No runtime behavior is changed.

  • #2751: Convert all named tuples from collections.namedtuple() to typing.NamedTuple classes with type annotations. This makes the classes self-documenting, effectively turning this module into a readable API reference.

Other API changes

  • #2992: Process.memory_percent() result is now rounded to 2 decimal places. It was the only *_percent API returning an unrounded float.

  • #2747, breaking: the field order of the named tuple returned by cpu_times() has been normalized on all platforms, and the first 3 fields are now always user, system, idle. See migration guide.

  • #2772, [Windows], breaking: cpu_times() interrupt field renamed to irq to match the field name used on Linux and BSD. interrupt still works but raises DeprecationWarning.

  • #2784, breaking: process_iter(): when attrs is specified, the pre-fetched values are now cached on the Process instance, so subsequent method calls return them without new system calls. The p.info dict is deprecated. See migration guide.

  • #2889, [Windows], breaking: 32-bit psutil can no longer inspect 64-bit processes. This relied on the undocumented NtWow64* APIs and stopped being tested when 32-bit wheels were dropped in 7.1.2 (#2657). Process.cwd() now raises AccessDenied in that case; Process.cmdline() and Process.environ() are unaffected. The opposite direction (64-bit psutil inspecting 32-bit processes) still works.

  • #2754: standardize sensors_battery()’s percent so that it returns a float instead of int on all systems, not only Linux.

  • #2799: Process.as_dict() now returns a dict with keys sorted alphabetically when attrs is not specified.

  • #2805, [BSD]: remove procfs dependency on NetBSD for cpu_stats() and virtual_memory(); values are now retrieved via the sysctl(9) and uvm(9) kernel APIs instead. (patch by Santhosh Raju)

  • #2947: psutil now emits a RuntimeWarning when it returns incomplete or approximated results due to an unexpected condition (e.g. a sanity check on kernel data which failed). Before, these events were only visible by enabling debug mode via the PSUTIL_DEBUG environment variable, so in practice they went unnoticed.

Performance

  • #2695, [Windows]: net_io_counters() is ~5x faster. GetAdaptersAddresses() is now invoked once instead of twice, and it skips collecting unicast / anycast / multicast / DNS details, which were retrieved but never used. net_if_stats() and net_if_addrs() also got faster. (patch by Arman Luthra)

  • #2919, #2920, [Windows]: Process.threads() is around 25x faster, Process.ppid() and Process.children() around 3.5x. They no longer snapshot every thread / process on the system with CreateToolhelp32Snapshot, and read NtQuerySystemInformation(SystemProcessInformation) in one shot instead. As a side effect Process.threads() no longer silently misses the threads which could not be opened due to AccessDenied.

  • #2922, [Windows]: Process.ppid() is around 58x faster (99x on ARM64). Instead of fetching the whole process table to read one field, the parent PID is now read from NtQueryInformationProcess(ProcessBasicInformation).

  • #2923, [Windows]: Process.status() is now part of the Process.oneshot() group, so within that context (also used by Process.as_dict()) it no longer costs an extra system-wide query. Reading 4 methods of that group in one Process.oneshot() block is now around 3.9x faster than reading them without it, up from 2x.

  • #2932, [Windows]: Process.open_files() is 140x to 400x faster (from 235 ms to 0.39 ms per call). It no longer enumerates every handle in the system with NtQuerySystemInformation(SystemExtendedHandleInformation), but per-process, via NtQueryInformationProcess(ProcessHandleInformation), and the ones which are not files are skipped by object type index, before being duplicated. Also, the internal thread used to query handle names is now created once per call instead of once per handle.

  • #2939: syscalls which can potentially block (disk devices, mount points, NIC drivers, etc) now release the GIL. Before, a slow psutil call would freeze all the other threads of the application for its whole duration.

Build and packaging

  • #2976, [Linux]: publish ppc64le and s390x wheels.

  • #2788, breaking: git tags renamed from release-X.Y.Z to vX.Y.Z. Old tags are kept for backward compatibility. See migration guide.

  • #2914, [macOS], breaking: Intel wheels now require macOS 10.15 (Catalina) or higher, up from 10.9. Older versions account for 0.01% of macOS downloads, and they must now build from source. arm64 wheels are unaffected: they already required macOS 11.

  • #2915, breaking: stop publishing wheels for free-threaded CPython 3.13 (cp313t). Free-threading was experimental in 3.13 and is officially not recommended. Publish only cp314t wheels.

  • #2576: the C extension modules now use PEP 489 multi-phase initialization instead of single-phase, which is the preferred mechanism for extension modules. Runtime behavior is unchanged.

  • #2765: add a PR bot that uses Claude to summarize PR changes and update changelog.rst and credits.rst when commenting with /changelog.

  • #2766: remove remaining Python 2.7 compatibility shims from setup.py, simplifying the build infrastructure.

  • #2844: removed docs/ from tarball. Tarball before: 586K. Tarball now: 396K.

  • #2883: the platform-specific C extension modules (_psutil_linux, _psutil_windows, etc.) are now built as a single private module named _psutil on all platforms.

  • #2909: setup.py no longer uses distutils, which was removed from the stdlib in Python 3.12, and only relies on setuptools.

  • #2925: the C sources are now compiled in parallel, making builds 2x to 3.6x faster. This mostly benefits the platforms getting no wheels from PyPI (*BSD, Solaris, AIX), where pip install psutil always compiles. Use PSUTIL_BUILD_JOBS to cap the number of jobs.

  • #2927: python dependencies (make install-pydeps-*) are now installed with uv when available, saving around 10 secs for each CI run.

Documentation

  • #2757, #2760: split docs from a single HTML file into multiple new sections: /about, /adoption (#2763), /alternatives (#2775), /api-overview, /credits (#2764), /faq (#2769), /funding (#2797), /genindex (#2808), /glossary (#2774), /install, /migration (#2771), /performance (#2787), /platform, /recipes (#2761), /shell-equivalents (#2768), /stdlib-equivalents (#2781). The old INSTALL.rst and CREDITS files, which lived in the root dir, moved there as well.

  • Blog: new blog at /blog (#2825), built via the ablog Sphinx extension, with 20 posts imported from https://gmpy.dev, covering psutil topics from 2014 to 2026. Posts are searchable, have an Atom feed, use OpenGraph for a nice preview when shared on social media, and have a comments section backed by giscus and GitHub Discussions (#2879).

  • Theming: renewed, modern, custom theme, with a top bar (#2819), a toggable dark theme (#2803, Shift+D), Monokai code snippets, a “last updated” stamp in the footer and an icon marking external URLs.

  • Usability: right TOC sidebar (#2828), a COPY button on code snippets (#2761), a “copy page” button copying the page’s RsT source (#2981), a “back to top” button, the psutil. prefix shown for all APIs, and search results styled as cards. Identifiers in code blocks (e.g. psutil.Process(), p.cpu_percent()) are now clickable and link to their API reference entry, via sphinx-codeautolink (#2826). Doc clarity was improved and long sentences shortened (#2745, #2801). New keyboard shortcuts (#2820): ? shows the helper, Shift+D toggles dark/light mode, Ctrl+K focuses the search box, Up/Down navigate the search results and Enter opens the selected one.

  • Go to API definition: pressing @ on any page opens a menu that fuzzy-matches psutil’s function, class and method names and jumps to their API definition, like in Sublime Text or VS Code (#2995).

  • Testing: rstcheck was replaced by sphinx-lint, plus a custom script detecting dead reference links in .rst files (#2767). Python code snippets are syntax-checked at build time (#2761). New make test-docs with sanity checks for the built HTML docs.

  • Hosting: doc is no longer hosted on Read the Docs. It’s now self-hosted on GitHub Pages under a new domain, https://psutil.io, and URLs no longer carry the /en language and version prefixes, e.g. https://psutil.io/faq/ (#2790). It’s rebuilt and deployed automatically on every push to master (#2739). Past releases are also served, e.g. https://psutil.io/7.2/, with a version selector in the top bar (#2980).

  • Misc: doc is built as part of CI (fails on error), all .rst files are wrapped to 79 characters via https://github.com/giampaolo/rstwrap (#2823), and /sitemap.xml was added to help search engine discovery. New custom 404 page (#2829): hovering over the © copyright in the footer reveals an easter egg which takes you there.

Dropped support

  • #2872, breaking: Dropped support for Python 3.6 and 3.7. Minimum version is now 3.8.

  • #2893, [Windows], breaking: Dropped support for Windows Vista, 7, 8, 8.1 and their server counterparts. Minimum version is now Windows 10 / Server 2016. See migration guide.

  • #2936, [Windows], breaking: dropped support for PyPy older than 7.3.14 (December 2023).

  • #2987, [macOS], breaking: dropped support for macOS 10.7 and 10.8. Minimum version is now 10.9.

Bug fixes: cross-platform

  • #2793: process_iter() was silently dropping zombie processes because ZombieProcess (a subclass of NoSuchProcess) was caught by the wrong except clause. Zombie processes are now yielded correctly.

  • #2895: Process methods could wrongly raise NoSuchProcess (“PID has been reused”) when the process creation time could not be determined, e.g. for zombies on NetBSD / OpenBSD or on AccessDenied on Windows. An unknown creation time is no longer treated as proof of PID reuse.

  • #2899: two Process instances for the same process could compare unequal if the creation time of either one could not be determined. They now compare equal, and hash(Process) is based on the PID alone.

Bug fixes: Linux

  • #2860, #2966, [Linux], critical: Process.cpu_affinity() could crash the interpreter with a segfault when PyLong_FromLong() returned NULL under memory pressure (the NULL is now checked and a proper MemoryError is raised instead), and on Python <= 3.11 it over-decref’ed the CPU numbers it returned, corrupting CPython’s small integer cache.

  • #2857, [Linux], [SunOS], memleak: fix refcount leak in disk_partitions() (Linux) and proc_environ() (SunOS) when PyArg_ParseTuple fails: parse arguments before allocating the result container, matching the pattern used in the other 26 call sites. Also fix a copy-paste typo in SunOS proc_environ() where the post-decode NULL check examined the wrong variable (py_envname instead of py_envval), which could let a NULL value reach PyDict_SetItem.

  • #2628, [Linux]: cpu_freq() no longer takes offline CPU cores into account. They were reported with all-zero frequencies, which dragged down the average current, min and max values.

  • #2715, [Linux]: wait_pid_pidfd_open() (from Process.wait()) crashes with EINVAL due to kernel race condition.

  • #2732, [Linux]: net_if_stats(): handle EBUSY from ioctl(SIOCETHTOOL).

  • #2770, [Linux]: fix cpu_count() (logical=False) raising ValueError on s390x architecture, where /proc/cpuinfo uses spaces before the colon separator instead of a tab.

  • #2809, [Linux]: swap_memory() and virtual_memory() raise ValueError if /proc/meminfo contains a field with no space after the colon, e.g. ShadowCallStack:10373888 kB, which occurs on arm64 when shadow call stacks exceed 10 GB.

  • #2830, [Linux], [macOS], [BSD]: Process.terminal() returned None for terminals opened after the first call, e.g. a new /dev/pts/N in a long running daemon. The list of terminal devices was cached forever, and is now refreshed when it doesn’t know a device.

  • #2871, [Linux]: Process.rlimit() returned RLIM_INFINITY as the unsigned 2**64-1 instead of -1 on Python 3.15+, which changed resource.prlimit() accordingly. psutil now maps it back to psutil.RLIM_INFINITY so the value stays consistent across Python versions.

  • #2967, [Linux]: cpu_freq() returned None on ppc machines without cpufreq sysfs. On s390x it matched both cpu MHz dynamic and cpu MHz static, reporting twice as many CPUs as the machine has.

  • #2512, [Linux]: cpu_freq() with percpu=True returned one entry per cpufreq policy instead of one per CPU, so on hardware where a policy is shared by several CPUs (POWER9, Apple M1, RISC-V) it reported fewer entries than cpu_count(). Each policy is now asked which CPUs it affects. (patch by Julien Stephan)

  • #2611: re-enable support for Android, which got broken on Python 3.13. Also include a working disk_partitions() which no longer raises PermissionError.

Bug fixes: Windows

  • #1967, [Windows], critical: Process.open_files() could deadlock the calling process. On timeout, the internal thread querying a handle name was killed with TerminateThread(), which cannot terminate a thread blocked in the kernel (e.g. on a pipe with a pending read) and left locks and memory in an inconsistent state. The thread is now abandoned and cleans up after itself.

  • #2859, [Windows], critical: net_connections() / Process.net_connections() could crash with an invalid Py_DECREF(NULL) when argument parsing failed before the result list was allocated. The error path now uses Py_XDECREF (including the temporary address-family / socket-type objects).

  • #2847, [Windows], critical: cpu_stats() read the context switches and syscalls counts from a buffer it had just freed.

  • #2934, [Windows], critical: Process.memory_maps() could crash the calling process with a stack buffer overflow if the inspected process had a mapped file whose path is longer than 260 characters. The buffer size was passed to GetMappedFileNameW() in bytes instead of characters. Also, such paths are now returned in full instead of truncated.

  • #2937, [Windows], critical: disk_io_counters() could let a disk driver write past the end of the DISK_PERFORMANCE buffer. When the driver asked for more space we retried passing a bigger size, but the buffer was a fixed size struct on the stack. It is now allocated (and grown) on the heap.

  • #2943, [Windows], critical: win_service_iter() could crash the interpreter instead of raising an exception if the service enumeration failed.

  • #2946, [Windows], critical: if the number of process heaps changed while heap_info() was running, it could read uninitialized memory and return bogus mmap_used and heap_count values.

  • #2972, [Windows], critical: on systems with more than 64 CPUs cpu_times() with percpu=True and cpu_stats() read uninitialized memory: the kernel only returns entries for the calling thread’s processor group, but the entries for the remaining CPUs were used as well.

  • #2932, [Windows], memleak: Process.open_files() leaked a thread and a handle for every name query which timed out (e.g. a pipe with a pending read), and could hang for around 1 minute if the process had a file open on an unreachable network share, where the os.stat() used to filter out directories went over the wire with no timeout.

  • #2935, [Windows], memleak: Process.kill() and Process.terminate() leaked a process handle when TerminateProcess() failed with an error other than ERROR_ACCESS_DENIED.

  • #1007, [Windows]: boot_time() no longer fluctuates by ~1 second across calls or across processes. It is now read atomically from the kernel via NtQuerySystemInformation(SystemTimeOfDayInformation), replacing the old time.time() - uptime() computation that sampled two counters from Python and produced sub-second differences.

  • #1959, [Windows]: disk_partitions() could raise UnicodeDecodeError on systems whose ANSI code page is not UTF-8 (e.g. cp1251). It now uses the wide-char Windows APIs throughout.

  • #2383, [Windows]: WindowsService.description() may fail with ERROR_FILE_NOT_FOUND when the description points at a missing resource (e.g. WaaSMedicSvc), which also broke WindowsService.as_dict(). Now it returns an empty string instead.

  • #2655, [Windows]: net_if_stats() returned 4294967295 (32-bit overflow) as the speed for network interfaces faster than ~4.29 Gbps (e.g. 5 Gbps NICs). Fixed by switching from the legacy GetIfTable() / MIB_IFROW API to GetIfEntry2() / MIB_IF_ROW2, which uses a 64-bit TransmitLinkSpeed field.

  • #2711, #2940, [Windows]: net_if_addrs() was returning None for the broadcast field of network interfaces instead of the correct broadcast address, and could report an IPv4 netmask for an IPv6 address of the same NIC (the netmask was reset once per interface instead of once per address).

  • #2875, [Windows]: sensors_battery() never returned POWER_TIME_UNKNOWN when the remaining battery time was unknown; it returned 4294967295 instead of -1 due to BatteryLifeTime being passed as an unsigned integer.

  • #2938, [Windows]: disk_partitions() returned a different opts string for volume mount points than for the drive they live on: the drive type (fixed, cdrom, …) was missing.

  • #2941, [Windows]: net_io_counters() raised RuntimeError, losing the counters of all the other NICs, if a NIC was disabled or unplugged mid-call. Now it’s skipped.

Bug fixes: macOS

  • #2885, [macOS], critical: Process.memory_full_info(), Process.memory_footprint() and Process.threads() no longer use task_for_pid() syscall, which can hang forever on headless VMs (e.g. CI runners). They now use proc_pidinfo(), which is more permissive and so raises AccessDenied less often.

  • #2382, [macOS]: cpu_freq() is now always defined on ARM64 and returns None when CPU frequency can’t be determined. Previously it was left undefined (or raised RuntimeError) when the pmgr IORegistry entry or its frequency data was unavailable, e.g. on virtualized ARM64 like CI runners.

  • #2411, [macOS]: Process.cpu_times() and Process.cpu_percent() calculation on macOS x86_64 (arm64 is fine) was highly inaccurate (41.67x lower).

  • #2642, [macOS]: fix cpu_freq() on Apple Silicon. On M4+ it returned values ~1000x too small because the voltage-statesN-sram IORegistry tables switched from Hz to kHz; on M5-family chips it failed because the hardcoded table indexes were renumbered. The implementation now enumerates CPU voltage-states*-sram tables dynamically, detects the unit per-value by magnitude, and filters CPU clusters from GPU/NPU tables via a per-table fmax threshold. Works uniformly from M1 through M5 Max. (patch by Bert Pluymers)

  • #2726, [macOS]: Process.num_ctx_switches() return an unusual high number due to a C type precision issue.

  • #2841, [macOS]: cpu_freq() could raise SystemError when CPU frequency data is missing or invalid in the IORegistry (e.g. on Apple M5 chips). It now returns None instead (see #2382).

  • #2853, [macOS]: virtual_memory() and swap_memory() could raise RuntimeError ((ipc/mig) array not large enough) on newer macOS versions.

  • #2854, [macOS]: Process.cmdline() and Process.environ() could raise SystemError after sysctl(KERN_PROCARGS2) failed with errno == 0. They now raise AccessDenied instead.

Bug fixes: BSD

  • #2744, [NetBSD], critical: fix possible double free() in swap_memory().

  • #2848, [BSD], critical: fix a stack buffer overflow in net_io_counters() when the kernel reports an unusually long interface name.

  • #1534, [NetBSD]: Process.exe() is now fetched natively via sysctl(KERN_PROC_PATHNAME) instead of reading the /proc/pid/exe symlink (a virtualization layer on NetBSD). (patch by Kamil Rytarowski)

  • #1801, [FreeBSD]: cpu_freq() could raise UnicodeDecodeError when the dev.cpu.N.freq_levels sysctl returned bytes which are not valid UTF-8.

  • #2746, [FreeBSD]: Process.memory_maps(), rss and private fields are erroneously reported in memory pages instead of bytes. Other platforms (Linux, macOS, Windows) return bytes.

  • #2782, [FreeBSD]: cpu_count() logical=False return None on systems without hyper threading.

  • #2791, [FreeBSD]: relax psutil_sysctl() / psutil_sysctlbyname() to allow the kernel to return fewer bytes than the buffer (normal for variable-length sysctl data).

  • #2795, [FreeBSD]: fix cpu_freq() failing with RuntimeError: sysctlbyname('dev.cpu.0.freq_levels') size mismatch on some systems.

  • #2811, #2813, [OpenBSD]: virtual_memory() shared returned pages instead of bytes, plus it was overvalued (summed shared virtual + real, now we only return real). buffers was always 0, and now returns the same value as cached, since OpenBSD does not distinguish between the 2.

  • #2814, #2815, [NetBSD]: virtual_memory() cached is overvalued, since it includes anonymous pages, and shared was overvalued (summed shared virtual + real, now we only return real).

  • #2822, [BSD]: Process.cmdline() on NetBSD could raise OSError: [Errno 14] Bad address if the process about to exit. It now raises NoSuchProcess instead.

  • #2888, [FreeBSD], [OpenBSD]: Process methods could wrongly raise NoSuchProcess (“PID has been reused”) for a process still alive, after a system clock update (e.g. NTP). Fixed by disabling the PID reuse check (also on SunOS and AIX).

  • #2902, [NetBSD], [OpenBSD]: Process.cmdline() could fail with OSError(EINVAL) for a process which died mid-call (OpenBSD), or raise a broken NoSuchProcess whose str() in turn raised TypeError (NetBSD).

  • #2903, [BSD]: Process.nice() could raise NoSuchProcess for processes in SIDL state (not yet fully initialized). It now retrieves the nice value via sysctl() instead of getpriority().

  • #2905, [FreeBSD], [OpenBSD], [NetBSD]: the saved field of Process.gids() mistakenly reported the process saved user ID instead of the saved group ID. Bug existed since 2011.

  • #2907, [NetBSD]: a process which is exiting, but is not a zombie yet, was not recognized as such. Process methods raised NoSuchProcess instead of ZombieProcess, and Process.status() returned "sleeping" or "?". Also, STATUS_SUSPENDED was never returned by Process.status(), despite being documented as NetBSD only, and Process.environ() raised OSError with EINVAL / EFAULT / EBUSY for a process which is exiting or is a zombie (it now returns an empty dict, or raises NoSuchProcess if the process is gone).

  • #2929, [NetBSD], [OpenBSD]: Process.num_fds() returned a wrong, system-wide number which didn’t change when the process opened a file, and Process.open_files() always returned an empty list.

  • #2951, [OpenBSD]: cpu_times() returned times averaged across CPUs instead of summed, like on all the other platforms. Now it sums the per-CPU counters.

  • #2952, [OpenBSD]: Process.environ() raised OSError(EINVAL) for a process which started exiting, e.g. mid-way to becoming a zombie. Also, for consistency, Process.environ() for a zombie now raises ZombieProcess on all BSDs (NetBSD used to return an empty dict, see #2911).

Bug fixes: UNIX

  • #2877, [UNIX], critical: fix a one-byte stack buffer overflow in users(). When ut_host fills the whole field it has no null terminator, and the terminator was written one byte past the end of the local buffer.

  • #2789, [AIX], build-fail: fix compilation error caused by a typo (accidental space) in psutil_net_io_counters(), introduced during a previous code reformatting.

  • #2858, [SunOS], memleak: disk_io_counters() leaked the result dictionary when kstat_read() failed mid-iteration; the error path now goes through the existing cleanup block.

  • #2687, [SunOS]: users() failed with ValueError on illumos.

  • #2778, [UNIX]: net_if_addrs() skips interfaces with no addresses, which are typically virtual IPv4/IPv6 tunnel interfaces. Now they are included in the returned dict with family == socket.AF_UNSPEC and an empty list of addresses. Main reason: it creates an inconsistency with net_io_counters() and net_if_stats() which do return these interface names.

  • #2964, [POSIX]: net_if_addrs() returned the interface’s own address as broadcast for /32 IPv4 addresses. A single-host network has no broadcast address, so None is returned now.

  • #2953, [SunOS]: Process.gids() returned a puids namedtuple instead of pgids. Process.nice() was offset by +20 compared to getpriority(3). Process.net_connections() returned UNIX sockets with type=-1 and fd=-1. Also, Process.net_connections() now raises ZombieProcess instead of RuntimeError for zombie processes.

7.2.2 — 2026-01-28

Performance

  • #2705, [Linux], [macOS], [BSD]: Process.wait() no longer uses a busy loop. It now uses pidfd_open() + poll() on Linux (requires Linux >= 5.3 and Python >= 3.9), and kqueue() on macOS and BSD.

Bug fixes

7.2.1 — 2025-12-29

Bug fixes

  • #2699, [FreeBSD], [NetBSD]: heap_info() does not detect small allocations (<= 1K). In order to fix that, we now flush internal jemalloc cache before fetching the metrics.

7.2.0 — 2025-12-23

New APIs

  • #1275: new heap_info() and heap_trim() functions, providing direct access to the platform’s native C heap allocator (glibc, mimalloc, libmalloc). Useful to create tools to detect memory leaks.

Build and packaging

  • #2680, breaking: unit tests are no longer installed / part of the distribution. They now live under tests/ instead of psutil/tests, so import psutil.tests no longer works (it was never documented to begin with).

  • #2403, [Linux]: publish wheels for Linux musl.

Bug fixes

  • #2684, [FreeBSD], build-fail: compilation fails on FreeBSD 14 due to missing include.

  • #2691, [Windows], memleak: fix memory leak in net_if_stats() due to missing Py_CLEAR.

7.1.3 — 2025-11-02

Internals

  • #2667: enforce clang-format on all C and header files. It is now the mandatory formatting style for all C sources.

  • #2676, #2678: replace unsafe sprintf / snprintf / sprintf_s with str_format, and strlcat / strlcpy with str_copy / str_append. Unifies string handling across platforms.

Bug fixes

  • #2677, [Windows], critical: fix MAC address string construction in net_if_addrs() (buffer overflow / misformat risk).

  • #2679, [OpenBSD], [NetBSD], build-fail: can’t build due to C syntax error.

  • #2672, [macOS], [BSD]: increase the chances to recognize zombie processes and raise the appropriate exception (ZombieProcess).

  • #2674, [Windows]: disk_usage() could truncate values on 32-bit platforms, potentially reporting incorrect total, free, used space for drives larger than 4GB.

  • #2675, [macOS]: Process.status() incorrectly returns STATUS_RUNNING for 99% of the processes.

7.1.2 — 2025-10-25

Build and packaging

  • #2657, breaking: stop publishing prebuilt Linux and Windows wheels for 32-bit Python. 32-bit CPython is still supported, but psutil must now be built from source.

  • #2565: produce wheels for free-thread cPython 3.13 and 3.14. (patch by Lysandros Nikolaou)

Bug fixes

7.1.1 — 2025-10-19

Internals

  • #2646, [SunOS]: add CI test runner for SunOS.

Dropped support

  • #2645, [SunOS], breaking: dropped support for SunOS 10.

Bug fixes

  • #2641, [SunOS], build-fail: cannot compile psutil from sources due to missing C include.

  • #2357, [SunOS]: Process.cmdline() does not handle spaces properly. (patch by Ben Raz)

7.1.0 — 2025-09-17

Build and packaging

Internals

  • #2575: introduced dprint CLI tool to format .yml and .md files.

Dropped support

  • #2571, [FreeBSD], breaking: Dropped support for FreeBSD 8 and earlier. FreeBSD 8 was maintained from 2009 to 2013.

Bug fixes

7.0.0 — 2025-02-13

New APIs

API changes

Dropped support

  • #2480, breaking: drop Python 2.7 support. Latest version supporting it is psutil 6.1.X (pip2 install psutil==6.1.*).

Bug fixes

6.1.1 — 2024-12-19

Internals

  • #2471: use Vulture CLI tool to detect dead code.

Bug fixes

6.1.0 — 2024-10-17

Performance

Internals

  • #2446: use pytest instead of unittest.

  • #2448: add make install-sysdeps target to install the necessary system dependencies (python-dev, gcc, etc.) on all supported UNIX flavors.

  • #2449: add make install-pydeps-test and make install-pydeps-dev targets. They can be used to install dependencies meant for running tests and for local development. They can also be installed via pip install .[test] and pip install .[dev].

  • #2456: allow running tests via python3 -m psutil.tests even if pytest is not installed.

Bug fixes

6.0.0 — 2024-06-18

New APIs

  • #2396: a new process_iter.cache_clear() API can be used to clear process_iter() internal cache.

API changes

Performance

  • #2396, breaking: process_iter() no longer preemptively checks whether PIDs have been reused, making it around 20x faster. Use Process.is_running() on yielded instances instead (it also removes reused PIDs from the internal cache).

Build and packaging

Internals

  • #2366, [Windows]: log debug message when using slower process APIs.

Bug fixes

  • #2360, [macOS], build-fail: can’t compile on macOS < 10.13. (patch by Ryan Schmidt)

  • #2362, [macOS], build-fail: can’t compile on macOS 10.11. (patch by Ryan Schmidt)

  • #2365, [macOS], build-fail: can’t compile on macOS < 10.9. (patch by Ryan Schmidt)

  • #2412, [macOS], build-fail: can’t compile on macOS 10.4 PowerPC due to missing MNT_ constants.

  • #2250, [NetBSD]: Process.cmdline() sometimes fail with EBUSY for long cmdlines. Now retries up to 50 times, returning an empty list as last resort.

  • #2254, [Linux]: offline cpus raise NotImplementedError in cpu_freq() (patch by Shade Gladden)

  • #2272: Add pickle support to psutil Exceptions.

  • #2359, [Windows]: pid_exists() disagrees with Process on whether a pid exists when ERROR_ACCESS_DENIED.

  • #2395, [OpenBSD]: pid_exists() erroneously return True if the argument is a thread ID (TID) instead of a PID (process ID).

5.9.8 — 2024-01-19

Performance

  • #2343, [FreeBSD]: filter net_connections() in C instead of Python, ~4x faster. Only requested connection types are now retrieved.

  • #2342, [NetBSD]: same as above (#2343) but for NetBSD.

Internals

  • #2349: adopted black formatting style.

Bug fixes

5.9.7 — 2023-12-17

Internals

  • #2324: enforce Ruff rule raw-string-in-exception, which helps providing clearer tracebacks when exceptions are raised by psutil.

Bug fixes

  • #2321, [Linux], [SunOS], build-fail: missing #include <unistd.h> causes an implicit declaration of close() and syscall().

  • #2325, [PyPy], build-fail: psutil did not compile on PyPy due to missing PyErr_SetExcFromWindowsErrWithFilenameObject cPython API.

5.9.6 — 2023-10-15

API changes

Internals

  • #2312: use ruff linter instead of flake8 + isort.

Dropped support

Bug fixes

5.9.5 — 2023-04-17

API changes

Internals

  • #2196: in case of exception, display a cleaner error traceback by hiding the KeyError bit deriving from a missed cache hit.

  • #2217: print the full traceback when a DeprecationWarning or UserWarning is raised.

  • #2240, [NetBSD], [OpenBSD]: add CI testing on every commit for NetBSD and OpenBSD platforms (python 3 only).

Bug fixes

5.9.4 — 2022-11-07

Build and packaging

  • #2102: use Limited API when building wheels with CPython 3.6+ on Linux, macOS and Windows. (patch by Matthieu Darbois)

Bug fixes

5.9.3 — 2022-10-18

Build and packaging

  • #2040, [macOS]: provide wheels for arm64 architecture. (patch by Matthieu Darbois)

Internals

Bug fixes

5.9.2 — 2022-09-04

Bug fixes

5.9.1 — 2022-05-20

New APIs

Performance

Dropped support

  • #1053, breaking: drop Python 2.6 support. (patches by Matthieu Darbois and Hugo van Kemenade)

Bug fixes

5.9.0 — 2021-12-29

New platforms

API changes

  • #1992: NoSuchProcess message now specifies if the PID has been reused. Error classes now have improved __repr__ and __str__.

  • #1999, [Linux]: disk_partitions(): convert /dev/root device (an alias used on some Linux distros) to real root device path.

Performance

Documentation

  • #2042: rewrite HISTORY.rst to use hyperlinks pointing to psutil API doc.

Internals

  • #2005: PSUTIL_DEBUG mode now prints file name and line number of the debug messages coming from C extension modules.

Bug fixes

5.8.0 — 2020-12-19

New APIs

  • #1863: disk_partitions() exposes 2 extra fields: maxfile and maxpath, which are the maximum file name and path name length.

New platforms

  • #1872, [Windows]: added support for PyPy 2.7.

Build and packaging

  • #1879: provide pre-compiled wheels for Linux and macOS (yey!).

Internals

  • #1880: switch CI from Travis/Cirrus to GitHub Actions (Linux, macOS, FreeBSD). AppVeyor still used for Windows.

Bug fixes

5.7.3 — 2020-10-24

New APIs

API changes

  • #1830, [POSIX]: net_if_stats() isup also checks whether the NIC is running (meaning Wi-Fi or ethernet cable is connected). (patch by Chris Burger)

  • #1837, [Linux]: improved battery detection and charge secsleft calculation (patch by @aristocratos)

Bug fixes

5.7.2 — 2020-07-15

Bug fixes

  • wheels for 2.7 were inadvertently deleted.

5.7.1 — 2020-07-15

New platforms

  • #1768, [Windows]: added support for Windows Nano Server. (contributed by Julien Lebot)

API changes

  • #1747: Process.wait() return value is cached so that the exit code can be retrieved on then next call.

  • #1747, [POSIX]: Process.wait() on POSIX now returns an enum, showing the negative signal which was used to terminate the process. It returns something like <Negsignal.SIGTERM: -15>.

  • #1747: Process class provides more info about the process on str() and repr() (status and exit code).

Performance

  • #1741, [POSIX]: make build now runs in parallel on Python >= 3.6 and it’s about 15% faster.

Internals

  • #1709: parallel tests on POSIX (make test-parallel). They’re twice as fast!

  • #1757: memory leak tests are now stable.

Bug fixes

5.7.0 — 2020-02-18

New platforms

  • #1637, [SunOS]: add partial support for old SunOS 5.10 Update 0 to 3.

  • #1686, [Windows]: added support for PyPy on Windows.

API changes

Performance

Internals

  • #1671, [FreeBSD]: add CI testing/service for FreeBSD (Cirrus CI).

  • #1682, [PyPy]: added CI / test integration for PyPy via Travis.

Dropped support

  • #1652, [Windows], breaking: dropped support for Windows XP and Windows Server 2003. Minimum supported Windows version now is Windows Vista.

Bug fixes

5.6.7 — 2019-11-26

Bug fixes

  • #1630, [Windows], build-fail: can’t compile source distribution due to C syntax error.

5.6.6 — 2019-11-25

Bug fixes

  • #1616, critical: use of Py_DECREF instead of Py_CLEAR will result in double free() and segfault (CVE-2019-18874). (patch by Riccardo Schirone)

  • #1619, [OpenBSD], build-fail: compilation fails due to C syntax error. (patch by Nathan Houghton)

  • #1179, [Linux]: Process.cmdline() now handles processes that use inappropriate chars to separate args.

5.6.5 — 2019-11-06

Bug fixes

  • #1615, build-fail: remove pyproject.toml as it was causing installation issues.

5.6.4 — 2019-11-04

New APIs

  • #1527, [Linux]: added Process.cpu_times() iowait counter, which is the time spent waiting for blocking I/O to complete.

Build and packaging

  • #1565: add PEP 517/8 build backend and requirements specification for better pip integration. (patch by Bernát Gábor)

Bug fixes

5.6.3 — 2019-06-11

New APIs

Bug fixes

5.6.2 — 2019-04-26

New APIs

API changes

  • #1404, [Linux]: cpu_count() with logical=False falls back to reading /sys/devices/system/cpu/*/topology/core_id if /proc/cpuinfo doesn’t provide the info.

Documentation

  • #1464: various docfixes (always point to Python 3 doc, fix links, etc.).

Internals

  • #1458: provide coloured test output. Also show failures on KeyboardInterrupt.

  • #1478: add make command to re-run tests failed on last run.

  • #1462, [Linux]: (tests) make tests invariant to LANG setting (patch by Benjamin Drung)

  • #1463: scripts/cpu_distribution.py was broken.

Bug fixes

5.6.1 — 2019-03-11

Bug fixes

  • #1448, [Windows], critical: crash on import due to rtlIpv6AddressToStringA not available on Wine.

  • #1451, [Windows], critical: Process.memory_full_info() segfaults. NtQueryVirtualMemory is now used instead of QueryWorkingSet to calculate USS memory.

  • #1329, [AIX], build-fail: psutil doesn’t compile on AIX 6.1. (patch by Arnon Yaari)

5.6.0 — 2019-03-05

New APIs

API changes

Performance

  • #1379, [Windows]: Process.suspend() and Process.resume() now use NtSuspendProcess / NtResumeProcess instead of stopping / resuming all threads. Faster and more reliable.

  • #1422, [Windows]: DLL-loaded Windows APIs are now loaded once on startup instead of per function call, significantly faster.

  • #1426, [Windows]: PAGESIZE and number of processors is now calculated on startup.

Internals

  • #1428: in case of error, the traceback message now shows the underlying C function called which failed.

  • #1442: Python 3 is now the default interpreter used by Makefile.

Bug fixes

5.5.1 — 2019-02-15

API changes

  • #1384, [Windows]: on Windows >= 8.1, Process.cmdline() falls back to NtQueryInformationProcess on ERROR_ACCESS_DENIED. (patch by EccoTheFlintstone)

Bug fixes

  • #1408, [AIX], build-fail: psutil won’t compile on AIX 7.1 due to missing header. (patch by Arnon Yaari)

  • #1394, [Windows]: Process.exe() returns “[Error 0] The operation completed successfully” when Python process runs in “Virtual Secure Mode”.

  • #1402: psutil exceptions’ repr() show the internal private module path.

5.5.0 — 2019-01-23

New APIs

Bug fixes

5.4.8 — 2018-10-30

API changes

Build and packaging

  • #1320, [POSIX]: better compilation support when using g++ instead of GCC. (patch by Jaime Fullaondo)

Bug fixes

5.4.7 — 2018-08-14

New APIs

API changes

Bug fixes

5.4.6 — 2018-06-07

API changes

Bug fixes

5.4.5 — 2018-04-13

Bug fixes

  • #1268: setup.py’s extra_require parameter requires latest setuptools version, breaking quite a lot of installations.

5.4.4 — 2018-04-13

New APIs

API changes

  • #771, [Windows], breaking: cpu_count() with logical=False on Windows XP and Vista is no longer supported and returns None.

Bug fixes

5.4.3 — 2018-01-01

API changes

Bug fixes

5.4.2 — 2017-12-07

New APIs

API changes

Performance

Internals

  • #1172, [Windows]: make test does not work.

Bug fixes

5.4.1 — 2017-11-08

New APIs

Internals

  • #1151: python -m psutil.tests fail.

Dropped support

  • #1053, breaking: drop Python 3.3 support (psutil still works but it’s no longer tested).

Bug fixes

  • #1154, [AIX], build-fail: psutil won’t compile on AIX 6.1.0. (patch by Arnon Yaari)

  • #1150, [Windows]: when a process is terminated now the exit code is set to SIGTERM instead of 0. (patch by Akos Kiss)

  • #1167, [Windows]: net_io_counters() packets count now include also non-unicast packets. (patch by Matthew Long)

5.4.0 — 2017-10-12

New platforms

Bug fixes

5.3.1 — 2017-09-10

Build and packaging

  • #1120, [Windows], breaking: .exe files are no longer uploaded on PyPI as per PEP-527. Only wheels are provided.

Documentation

Bug fixes

5.3.0 — 2017-09-01

New APIs

API changes

Build and packaging

  • #1060: source distribution now only includes relevant files.

Internals

  • #1058: test suite now enables all warnings by default.

Bug fixes

5.2.2 — 2017-04-10

Bug fixes

5.2.1 — 2017-03-24

Bug fixes

5.2.0 — 2017-03-05

New APIs

Bug fixes

5.1.3 — 2017-02-07

Bug fixes

5.1.2 — 2017-02-03

Bug fixes

5.1.1 — 2017-02-03

API changes

Bug fixes

5.1.0 — 2017-02-01

New APIs

Bug fixes

  • #948, build-fail: cannot install psutil with PYTHONOPTIMIZE=2.

  • #687, [Linux]: pid_exists() no longer returns True if passed a process thread ID.

  • #950, [Windows]: Process.cpu_percent() was calculated incorrectly and showed higher number than real usage.

  • #951, [Windows]: the uploaded wheels for Python 3.6 64 bit didn’t work.

  • #959: psutil exception objects could not be pickled.

  • #960: Popen wait() did not return the correct negative exit status if process is killed by a signal.

  • #961, [Windows]: WindowsService.description() method may fail with ERROR_MUI_FILE_NOT_FOUND.

5.0.1 — 2016-12-21

Build and packaging

  • #939: tar.gz distribution went from 1.8M to 258K.

Bug fixes

  • #609, [SunOS], build-fail: psutil does not compile on Solaris 10.

  • #936, [Windows], build-fail: fix compilation error on VS 2013 (patch by Max Bélanger).

  • #811, [Windows]: provide a more meaningful error message if trying to use psutil on unsupported Windows XP.

  • #940, [Linux]: cpu_percent() and cpu_times_percent() was calculated incorrectly as iowait, guest and guest_nice times were not properly taken into account.

  • #944, [OpenBSD]: pids() was omitting PID 0.

5.0.0 — 2016-11-06

New APIs

Bug fixes

4.4.2 — 2016-10-26

Bug fixes

  • #931, [SunOS], build-fail: psutil no longer compiles on Solaris.

4.4.1 — 2016-10-25

Bug fixes

  • #927: Popen __del__ may cause maximum recursion depth error.

4.4.0 — 2016-10-23

New APIs

API changes

  • #887, [Linux]: virtual_memory() available and used are more precise and match free utility. Also handles LXC containers.

Internals

Bug fixes

4.3.1 — 2016-09-01

Build and packaging

  • #881: make install now works also when using a virtual env.

Bug fixes

4.3.0 — 2016-06-18

Bug fixes

  • #812, [NetBSD], build-fail: fix compilation on NetBSD-5.x.

  • #810, [Windows]: Windows wheels are incompatible with pip 7.1.2.

  • #823, [NetBSD]: virtual_memory() raises TypeError on Python 3.

  • #829, [POSIX]: disk_usage() percent field takes root reserved space into account.

  • #816, [Windows]: fixed net_io_counters() values wrapping after 4.3GB in Windows Vista (NT 6.0) and above using 64bit values from newer win APIs.

4.2.0 — 2016-05-14

New APIs

Performance

Bug fixes

4.1.0 — 2016-03-12

New APIs

Bug fixes

4.0.0 — 2016-02-17

New APIs

Build and packaging

  • #660, [Windows]: make.bat is smarter in finding alternative VS install locations. (patch by @mpderbec)

Internals

Bug fixes

3.4.2 — 2016-01-20

New APIs

  • #728, [SunOS]: exposed PROCFS_PATH constant to change the default location of /proc filesystem.

Bug fixes

3.4.1 — 2016-01-15

New platforms

  • #557, [NetBSD]: added NetBSD support. (contributed by Ryo Onodera and Thomas Klausner)

API changes

Performance

Bug fixes

3.3.0 — 2015-11-25

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

3.2.2 — 2015-10-04

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.

3.2.1 — 2015-09-03

Bug fixes

  • #677, [Linux], build-fail: can’t install psutil due to bug in setup.py.

3.2.0 — 2015-09-02

New APIs

API changes

Internals

Bug fixes

3.1.1 — 2015-07-15

Bug fixes

3.1.0 — 2015-07-15

API changes

Documentation

Internals

Bug fixes

3.0.1 — 2015-06-18

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.

3.0.0 — 2015-06-13

New APIs

API changes

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

2.2.1 — 2015-02-02

Bug fixes

2.2.0 — 2015-01-06

New APIs

Internals

Dropped support

  • #521, breaking: drop support for Python 2.4 and 2.5.

Bug fixes

2.1.3 — 2014-09-26

Bug fixes

  • #536, [Linux], build-fail: fix “undefined symbol: CPU_ALLOC” compilation error.

2.1.2 — 2014-09-21

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

2.1.1 — 2014-04-30

Bug fixes

2.1.0 — 2014-04-08

New APIs

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.

2.0.0 — 2014-03-10

New APIs

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()

  • #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

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

1.2.1 — 2013-11-25

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.

1.2.0 — 2013-11-20

New APIs

  • #440: new wait_procs() utility function which waits for multiple processes to terminate.

API changes

Bug fixes

  • #348, [Windows], critical: fix “ImportError: DLL load failed” occurring on module import on Windows XP / Vista.

1.1.3 — 2013-11-07

Bug fixes

  • #442, [Linux], build-fail: psutil won’t compile on certain version of Linux because of missing prlimit(2) syscall.

1.1.2 — 2013-10-22

Bug fixes

  • #442, [Linux], build-fail: psutil won’t compile on Debian 6.0 because of missing prlimit(2) syscall.

1.1.1 — 2013-10-08

Bug fixes

  • #442, [Linux], build-fail: psutil won’t compile on kernels < 2.6.36 due to missing prlimit(2) syscall.

1.1.0 — 2013-09-28

New APIs

API changes

  • #408: turn STATUS_* and CONN_* constants into plain Python strings.

Performance

Build and packaging

  • #410: host tar.gz and Windows binary files are on PyPI.

Bug fixes

1.0.1 — 2013-07-12

Bug fixes

1.0.0 — 2013-07-10

New platforms

  • #18, [SunOS]: add Solaris support (yay!) (thanks Justin Venus)

API changes

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

0.7.1 — 2013-05-03

Bug fixes

0.7.0 — 2013-04-12

New APIs

API changes

  • #246: psutil.error module is deprecated and scheduled for removal.

Internals

  • #233: code migrated to Mercurial (yay!)

Bug fixes

0.6.1 — 2012-08-16

API changes

Bug fixes

0.6.0 — 2012-08-13

New APIs

API changes

Performance

Internals

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.

0.5.1 — 2012-06-29

API changes

Bug fixes

0.5.0 — 2012-06-27

New APIs

API changes

Performance

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

0.4.1 — 2011-12-14

Bug fixes

0.4.0 — 2011-10-29

New APIs

API changes

  • #198: Process.wait() with timeout=0 can now be used to make the function return immediately.

Performance

Build and packaging

  • #157, [Windows]: provide installer for Python 3.2 64-bit.

Internals

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.

0.3.0 — 2011-07-08

New APIs

Build and packaging

  • #179: setuptools is now used in setup.py

Bug fixes

0.2.1 — 2011-03-20

New APIs

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

Bug fixes

0.2.0 — 2010-11-13

New APIs

New platforms

  • #107, [Windows]: add support for Windows 64 bit. (patch by cjgohlke)

  • #117, [Windows]: added support for Windows 2000.

API changes

Performance

Bug fixes

0.1.3 — 2010-03-02

New APIs

New platforms

  • #61, [FreeBSD]: added support for FreeBSD 64 bit.

  • #75: Python 3 support.

Performance

Bug fixes

0.1.2 — 2009-05-06

New APIs

Bug fixes

0.1.1 — 2009-03-06

New APIs

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.

0.1.0 — 2009-01-27

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.