🐛 Bug fixes
- 🚚 1615_: remove pyproject.toml as it was causing installation issues.
- 🐧 1527_: [Linux] added Process.cpu_times().iowait counter, which is the time spent waiting for blocking I/O to complete.
- 🏗 1565_: add PEP 517/8 build backend and requirements specification for better pip integration. (patch by Bernát Gábor)
🐛 Bug fixes
- 🏁 875_: [Windows] Process' cmdline(), environ() or cwd() may occasionally fail with ERROR_PARTIAL_COPY which now gets translated to AccessDenied.
- 🐧 1126_: [Linux] cpu_affinity() segfaults on CentOS 5 / manylinux. cpu_affinity() support for CentOS 5 was removed.
- 1528_: [AIX] compilation error on AIX 7.2 due to 32 vs 64 bit differences. (patch by Arnon Yaari)
- 1535_: 'type' and 'family' fields returned by net_connections() are not always turned into enums.
- 1536_: [NetBSD] process cmdline() erroneously raise ZombieProcess error if cmdline has non encodable chars.
- 1546_: usage percent may be rounded to 0 on Python 2.
- 🏁 1552_: [Windows] getloadavg() math for calculating 5 and 15 mins values is incorrect.
- 🐧 1568_: [Linux] use CC compiler env var if defined.
- 🏁 1570_: [Windows]
NtWow64*syscalls fail to raise the proper error code
- 1585_: [OSX] calling close() (in C) on possible negative integers. (patch by Athos Ribeiro)
- 1606_: [SunOS] compilation fails on SunOS 5.10. (patch by vser1)
- 👍 1494_: [AIX] added support for Process.environ(). (patch by Arnon Yaari)
🐛 Bug fixes
- 1276_: [AIX] can't get whole cmdline(). (patch by Arnon Yaari)
- 🏁 1501_: [Windows] Process cmdline() and exe() raise unhandled "WinError 1168 element not found" exceptions for "Registry" and "Memory Compression" psuedo processes on Windows 10.
- 1526_: [NetBSD] process cmdline() could raise MemoryError. (patch by Kamil Rytarowski)
- 🏁 604_: [Windows, Windows] add new psutil.getloadavg(), returning system load average calculation, including on Windows (emulated). (patch by Ammar Askar)
- 🐧 1404_: [Linux] cpu_count(logical=False) uses a second method (read from
/sys/devices/system/cpu/cpu[0-9]/topology/core_id) in order to determine the number of physical CPUs in case /proc/cpuinfo does not provide this info.
- ✅ 1458_: provide coloured test output. Also show failures on KeyboardInterrupt.
- 🛠 1464_: various docfixes (always point to python3 doc, fix links, etc.).
- 🏁 1476_: [Windows] it is now possible to set process high I/O priority (ionice()).Also, I/O priority values are now exposed as 4 new constants: IOPRIO_VERYLOW, IOPRIO_LOW, IOPRIO_NORMAL, IOPRIO_HIGH.
- ✅ 1478_: add make command to re-run tests failed on last run.
🐛 Bug fixes
- 🏁 1223_: [Windows] boot_time() may return value on Windows XP.
- 🐧 1456_: [Linux] cpu_freq() returns None instead of 0.0 when min/max not available (patch by Alex Manuskin)
- 🐧 1462_: [Linux] (tests) make tests invariant to LANG setting (patch by Benjamin Drung)
- 1463_: cpu_distribution.py script was broken.
- 🐧 1470_: [Linux] disk_partitions(): fix corner case when /etc/mtab doesn't exist. (patch by Cedric Lamoriniere)
- 1471_: [SunOS] Process name() and cmdline() can return SystemError. (patch by Daniel Beer)
- 🐧 1472_: [Linux] cpu_freq() does not return all CPUs on Rasbperry-pi 3.
- ✅ 1474_: fix formatting of psutil.tests() which mimicks 'ps aux' output.
- 🏁 1475_: [Windows] OSError.winerror attribute wasn't properly checked resuling in WindowsError being raised instead of AccessDenied.
- 🏁 1477_: [Windows] wrong or absent error handling for private NTSTATUS Windows APIs. Different process methods were affected by this.
- 🏁 1480_: [Windows] psutil.cpu_count(logical=False) could cause a crash due to fixed read violation. (patch by Samer Masterson)
- 1486_: [AIX, SunOS] AttributeError when interacting with Process methods involved into oneshot() context.
- 1491_: [SunOS] net_if_addrs(): free() ifap struct on error. (patch by Agnewee)
- 🐧 1493_: [Linux] cpu_freq(): handle the case where /sys/devices/system/cpu/cpufreq/ exists but is empty.
🐛 Bug fixes
- 1329_: [AIX] psutil doesn't compile on AIX 6.1. (patch by Arnon Yaari)
- 🏁 1448_: [Windows] crash on import due to rtlIpv6AddressToStringA not available on Wine.
- 🏁 1451_: [Windows] Process.memory_full_info() segfaults. NtQueryVirtualMemory is now used instead of QueryWorkingSet to calculate USS memory.
- 🏁 1379_: [Windows] Process suspend() and resume() now use NtSuspendProcess and NtResumeProcess instead of stopping/resuming all threads of a process. This is faster and more reliable (aka this is what ProcessHacker does).
- 🏁 1420_: [Windows] in case of exception disk_usage() now also shows the path name.
- 🏁 1422_: [Windows] Windows APIs requiring to be dynamically loaded from DLL libraries are now loaded only once on startup (instead of on per function call) significantly speeding up different functions and methods.
- 🏁 1426_: [Windows] PAGESIZE and number of processors is now calculated on startup.
- 1428_: in case of error, the traceback message now shows the underlying C function called which failed.
- 1433_: new Process.parents() method. (idea by Ghislain Le Meur)
- 1437_: pids() are returned in sorted order.
- 0️⃣ 1442_: python3 is now the default interpreter used by Makefile.
🐛 Bug fixes
- 1353_: process_iter() is now thread safe (it rarely raised TypeError).
- 🏁 1394_: [Windows] Process name() and exe() may erroneously return "Registry". QueryFullProcessImageNameW is now used instead of GetProcessImageFileNameW in order to prevent that.
- 1411_: [BSD] lack of Py_DECREF could cause segmentation fault on process instantiation.
- 🏁 1419_: [Windows] Process.environ() raises NotImplementedError when querying a 64-bit process in 32-bit-WoW mode. Now it raises AccessDenied.
- 1427_: [OSX] Process cmdline() and environ() may erroneously raise OSError on failed malloc().
- 🏁 1429_: [Windows] SE DEBUG was not properly set for current process. It is now, and it should result in less AccessDenied exceptions for low-pid processes.
- 🏁 1432_: [Windows] Process.memory_info_ex()'s USS memory is miscalculated because we're not using the actual system PAGESIZE.
- 1439_: [NetBSD] Process.connections() may return incomplete results if using oneshot().
- 👻 1447_: original exception wasn't turned into NSP/AD exceptions when using Process.oneshot() ctx manager.
Incompatible API changes
- 1291_: [OSX] Process.memory_maps() was removed because inherently broken (segfault) for years.
- 🏁 1348_: [Windows] on Windows >= 8.1 if Process.cmdline() fails due to ERROR_ACCESS_DENIED attempt using NtQueryInformationProcess + ProcessCommandLineInformation. (patch by EccoTheFlintstone)
🐛 Bug fixes
- 🏁 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.
- 1408_: [AIX] psutil won't compile on AIX 7.1 due to missing header. (patch by Arnon Yaari)
- 👍 1350_: [FreeBSD] added support for sensors_temperatures(). (patch by Alex Manuskin)
- 👍 1352_: [FreeBSD] added support for CPU frequency. (patch by Alex Manuskin)
🐛 Bug fixes
- 1111_: Process.oneshot() is now thread safe.
- 🐧 1354_: [Linux] disk_io_counters() fails on Linux kernel 4.18+.
- 🐧 1357_: [Linux] Process' memory_maps() and io_counters() method are no longer exposed if not supported by the kernel.
- 🏁 1368_: [Windows] fix psutil.Process().ionice(...) mismatch. (patch by EccoTheFlintstone)
- 🏁 1370_: [Windows] improper usage of CloseHandle() may lead to override the original error code when raising an exception.
- 1373_: incorrect handling of cache in Process.oneshot() context causes Process instances to return incorrect results.
- 🏁 1376_: [Windows] OpenProcess() now uses PROCESS_QUERY_LIMITED_INFORMATION access rights wherever possible, resulting in less AccessDenied exceptions being thrown for system processes.
- 🏁 1376_: [Windows] check if variable is NULL before free()ing it. (patch by EccoTheFlintstone)
- 🐧 1197_: [Linux] cpu_freq() is now implemented by parsing /proc/cpuinfo in case /sys/devices/system/cpu/* filesystem is not available.
- 🐧 1310_: [Linux] psutil.sensors_temperatures() now parses /sys/class/thermal in case /sys/class/hwmon fs is not available (e.g. Raspberry Pi). (patch by Alex Manuskin)
- 👍 1320_: [Posix] better compilation support when using g++ instead of gcc. (patch by Jaime Fullaondo)
🐛 Bug fixes
- 🖨 715_: do not print exception on import time in case cpu_times() fails.
- 🐧 1004_: [Linux] Process.io_counters() may raise ValueError.
- 1277_: [OSX] available and used memory (psutil.virtual_memory()) metrics are not accurate.
- 🏁 1294_: [Windows] psutil.Process().connections() may sometimes fail with intermittent 0xC0000001. (patch by Sylvain Duchesne)
- 🐧 1307_: [Linux] disk_partitions() does not honour PROCFS_PATH.
- 1320_: [AIX] system CPU times (psutil.cpu_times()) were being reported with ticks unit as opposed to seconds. (patch by Jaime Fullaondo)
- 🖨 1332_: [OSX] psutil debug messages are erroneously printed all the time. (patch by Ilya Yanok)
- 1346_: [SunOS] net_connections() returns an empty list. (patch by Oleksii Shevchuk)
- 🍎 1286_: [macOS] psutil.OSX constant is now deprecated in favor of new psutil.MACOS.
- 🐧 1309_: [Linux] added psutil.STATUS_PARKED constant for Process.status().
- 🐧 1321_: [Linux] add disk_io_counters() dual implementation relying on /sys/block filesystem in case /proc/diskstats is not available. (patch by Lawrence Ye)
🐛 Bug fixes
- 🍎 1209_: [macOS] Process.memory_maps() may fail with EINVAL due to poor task_for_pid() syscall. AccessDenied is now raised instead.
- 🍎 1278_: [macOS] Process.threads() incorrectly return microseconds instead of seconds. (patch by Nikhil Marathe)
- 🍎 1279_: [Linux, macOS, BSD] net_if_stats() may return ENODEV.
- 🏁 1294_: [Windows] psutil.Process().connections() may sometime fail with MemoryError. (patch by sylvainduchesne)
- 🐧 1305_: [Linux] disk_io_stats() may report inflated r/w bytes values.
- 🐧 1309_: [Linux] Process.status() is unable to recognize "idle" and "parked" statuses (returns '?').
- 🐧 1313_: [Linux] disk_io_counters() can report inflated IO counters due to erroneously counting base disk device and its partition(s) twice.
- 🐧 1323_: [Linux] sensors_temperatures() may fail with ValueError.