psutil v5.9.0 Release Notes

  • 2021-12-29

    Enhancements

    • 🐧 1851_, [Linux]: cpu_freq()_ is slow on systems with many CPUs. Read current frequency values for all CPUs from /proc/cpuinfo instead of opening many files in /sys fs. (patch by marxin)
    • 1992_: NoSuchProcess_ message now specifies if the PID has been reused.
    • 1992_: error classes (NoSuchProcess, AccessDenied, etc.) now have a better formatted and separated __repr__ and __str__ implementations.
    • 👍 1996_, [BSD]: add support for MidnightBSD. (patch by Saeed Rasooli)
    • 🐧 1999_, [Linux]: disk_partitions()_: convert /dev/root device (an alias used on some Linux distros) to real root device path.
    • 2005_: PSUTIL_DEBUG mode now prints file name and line number of the debug messages coming from C extension modules.
    • 2042_: rewrite HISTORY.rst to use hyperlinks pointing to psutil API doc.

    🐛 Bug fixes

    • 🍎 1456_, [macOS], [critical]: cpu_freq()_ min and max are set to 0 if can't be determined (instead of crashing).
    • 🍎 1512_, [macOS]: sometimes Process.connections()_ will crash with EOPNOTSUPP for one connection; this is now ignored.
    • 🏁 1598_, [Windows]: disk_partitions()_ only returns mountpoints on drives where it first finds one.
    • 1874_, [SunOS]: swap output error due to incorrect range.
    • 🍎 1892_, [macOS]: cpu_freq()_ broken on Apple M1.
    • 🍎 1901_, [macOS]: different functions, especially Process.open_files()_ and Process.connections(), could randomly raise AccessDenied because the internal buffer of proc_pidinfo(PROC_PIDLISTFDS) syscall was not big enough. We now dynamically increase the buffer size until it's big enough instead of giving up and raising AccessDenied_, which was a fallback to avoid crashing.
    • 🏁 1904_, [Windows]: OpenProcess fails with ERROR_SUCCESS due to GetLastError() called after sprintf(). (patch by alxchk)
    • 🐧 1913_, [Linux]: wait_procs()_ should catch subprocess.TimeoutExpired exception.
    • 🐧 1919_, [Linux]: sensors_battery()_ can raise TypeError on PureOS.
    • 🏁 1921_, [Windows]: swap_memory()_ shows committed memory instead of swap.
    • 🐧 1940_, [Linux]: psutil does not handle ENAMETOOLONG when accessing process file descriptors in procfs. (patch by Nikita Radchenko)
    • 1948_, [critical]: memoize_when_activated decorator is not thread-safe. (patch by Xuehai Pan)
    • 🏁 1953_, [Windows], [critical]: disk_partitions()_ crashes due to insufficient buffer len. (patch by MaWe2019)
    • 🏁 1965_, [Windows], [critical]: fix "Fatal Python error: deallocating None" when calling users()_ multiple times.
    • 🏁 1980_, [Windows]: 32bit / WoW64 processes fails to read Process.name()_ longer than 128 characters resulting in AccessDenied_. This is now fixed. (patch by PetrPospisil)
    • 1991_, [critical]: process_iter()_ is not thread safe and can raise TypeError if invoked from multiple threads.
    • 🍎 1956_, [macOS]: Process.cpu_times()_ reports incorrect timings on M1 machines. (patch by Olivier Dormond)
    • 🐧 2023_, [Linux]: cpu_freq()_ return order is wrong on systems with more than 9 CPUs.