psutil (process and system utilities) is a cross-platform library for retrieving information on running processes and system utilization (CPU, memory, disks, network, sensors) in Python. It is useful mainly for system monitoring, profiling and limiting process resources and management of running processes. It implements many functionalities offered by UNIX command line tools such as: ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap. psutil currently supports the following platforms:
- Linux
- Windows
- macOS
- FreeBSD, OpenBSD, NetBSD
- Sun Solaris
- AIX
...both 32-bit and 64-bit architectures. Supported Python versions are 2.6, 2.7 and 3.4+. PyPy is also known to work.
psutil was created and is maintained by Giampaolo Rodola and it received many useful contributions over the years. A lot of time and effort went into making psutil as it is right now. If you feel psutil is useful to you or your business and want to support its future development consider making a small donation:

Don't want to donate money? Then maybe you could write me a recommendation on Linkedin.
![]() | ![]() |
![]() | ![]() |
Also see scripts directory and doc recipes.
psutil has roughly the following monthly downloads:
There are over 10.000 open source projects on github which depend from psutil. Here's some I find particularly interesting:
- https://github.com/google/grr
- https://github.com/facebook/osquery/
- https://github.com/nicolargo/glances
- https://github.com/Jahaja/psdash
- https://github.com/ajenti/ajenti
- https://github.com/home-assistant/home-assistant/
- Go: https://github.com/shirou/gopsutil
- C: https://github.com/hamon-in/cpslib
- Node: https://github.com/christkv/node-psutil
- Rust: https://github.com/borntyping/rust-psutil
- Ruby: https://github.com/spacewander/posixpsutil
- Nim: https://github.com/johnscillieri/psutil-nim
This represents pretty much the whole psutil API.
>>>importpsutil>>>>>>psutil.cpu_times() scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, nice=0.0) >>>>>>forxinrange(3): ... psutil.cpu_percent(interval=1) ... 4.05.93.8>>>>>>forxinrange(3): ... psutil.cpu_percent(interval=1, percpu=True) ... [4.0, 6.9, 3.7, 9.2] [7.0, 8.5, 2.4, 2.1] [1.2, 9.0, 9.9, 7.2] >>>>>>forxinrange(3): ... psutil.cpu_times_percent(interval=1, percpu=False) ... scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) >>>>>>psutil.cpu_count() 4>>>psutil.cpu_count(logical=False) 2>>>>>>psutil.cpu_stats() scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0) >>>>>>psutil.cpu_freq() scpufreq(current=931.42925, min=800.0, max=3500.0) >>>>>>psutil.getloadavg() # also on Windows (emulated) (3.14, 3.89, 4.67)>>>psutil.virtual_memory() svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304) >>>psutil.swap_memory() sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944) >>>>>>psutil.disk_partitions() [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'), sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw')] >>>>>>psutil.disk_usage('/') sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5) >>>>>>psutil.disk_io_counters(perdisk=False) sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412) >>>>>>psutil.net_io_counters(pernic=True){'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0), 'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)} >>>>>>psutil.net_connections() [sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254), sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987), ...] >>>>>>psutil.net_if_addrs(){'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)], 'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]} >>>>>>psutil.net_if_stats(){'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536), 'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500)} >>>>>>importpsutil>>>psutil.sensors_temperatures(){'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)], 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)], 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0), shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]} >>>>>>psutil.sensors_fans(){'asus': [sfan(label='cpu_fan', current=3200)]} >>>>>>psutil.sensors_battery() sbattery(percent=93, secsleft=16628, power_plugged=False) >>>>>>importpsutil>>>psutil.users() [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352), suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)] >>>>>>psutil.boot_time() 1365519115.0>>>>>>importpsutil>>>psutil.pids() [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071] >>>>>>p=psutil.Process(7055) >>>ppsutil.Process(pid=7055, name='python', started='09:04:44') >>>p.name() 'python'>>>p.exe() '/usr/bin/python'>>>p.cwd() '/home/giampaolo'>>>p.cmdline() ['/usr/bin/python', 'main.py'] >>>>>>p.pid7055>>>p.ppid() 7054>>>p.children(recursive=True) [psutil.Process(pid=29835, name='python2.7', started='11:45:38'), psutil.Process(pid=29836, name='python2.7', started='11:43:39')] >>>>>>p.parent() psutil.Process(pid=4699, name='bash', started='09:06:44') >>>p.parents() [psutil.Process(pid=4699, name='bash', started='09:06:44'), psutil.Process(pid=4689, name='gnome-terminal-server', started='0:06:44'), psutil.Process(pid=1, name='systemd', started='05:56:55')] >>>>>>p.status() 'running'>>>p.username() 'giampaolo'>>>p.create_time() 1267551141.5019531>>>p.terminal() '/dev/pts/0'>>>>>>p.uids() puids(real=1000, effective=1000, saved=1000) >>>p.gids() pgids(real=1000, effective=1000, saved=1000) >>>>>>p.cpu_times() pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1) >>>p.cpu_percent(interval=1.0) 12.1>>>p.cpu_affinity() [0, 1, 2, 3] >>>p.cpu_affinity([0, 1]) # set>>>p.cpu_num() 1>>>>>>p.memory_info() pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0) >>>p.memory_full_info() # "real" USS memory usage (Linux, macOS, Win only)pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0) >>>p.memory_percent() 0.7823>>>p.memory_maps() [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0), pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0), pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0), pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0), ...] >>>>>>p.io_counters() pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543) >>>>>>p.open_files() [popenfile(path='/home/giampaolo/svn/psutil/setup.py', fd=3, position=0, mode='r', flags=32768), popenfile(path='/var/log/monitd', fd=4, position=235542, mode='a', flags=33793)] >>>>>>p.connections() [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'), pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')] >>>>>>p.num_threads() 4>>>p.num_fds() 8>>>p.threads() [pthread(id=5234, user_time=22.5, system_time=9.2891), pthread(id=5237, user_time=0.0707, system_time=1.1)] >>>>>>p.num_ctx_switches() pctxsw(voluntary=78, involuntary=19) >>>>>>p.nice() 0>>>p.nice(10) # set>>>>>>p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only)>>>p.ionice() pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0) >>>>>>p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only)>>>p.rlimit(psutil.RLIMIT_NOFILE) (5, 5) >>>>>>p.environ(){'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto', 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg', ...} >>>>>>p.as_dict(){'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...} >>>p.is_running() True>>>p.suspend() >>>p.resume() >>>>>>p.terminate() >>>p.wait(timeout=3) 0>>>>>>psutil.test() USERPID%CPU%MEMVSZRSSTTYSTARTTIMECOMMANDroot10.00.0245842240Jun1700:00initroot20.00.000Jun1700:00kthreadd ... giampaolo314750.00.0207603024/dev/pts/0Jun1900:00python2.4giampaolo317210.02.277306018189600:0410:30chromeroot317630.00.00000:0500:00kworker/0:1>>>>>>importpsutil>>>forprocinpsutil.process_iter(attrs=['pid', 'name']): ... print(proc.info) ...{'pid': 1, 'name': 'systemd'}{'pid': 2, 'name': 'kthreadd'}{'pid': 3, 'name': 'ksoftirqd/0'} ... >>>>>>psutil.pid_exists(3) True>>>>>>defon_terminate(proc): ... print("process{} terminated".format(proc)) ... >>># waits for multiple processes to terminate>>>gone, alive=psutil.wait_procs(procs_list, timeout=3, callback=on_terminate) >>>Popen wrapper:
>>>importpsutil>>>fromsubprocessimportPIPE>>>p=psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE) >>>p.name() 'python'>>>p.username() 'giampaolo'>>>p.communicate() ('hello\n', None) >>>p.wait(timeout=2) 0>>>>>>list(psutil.win_service_iter()) [<WindowsService(name='AeLookupSvc', display_name='Application Experience') at38850096>, <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at38850128>, <WindowsService(name='APNMCP', display_name='Ask Update Service') at38850160>, <WindowsService(name='AppIDSvc', display_name='Application Identity') at38850192>, ...] >>>s=psutil.win_service_get('alg') >>>s.as_dict(){'binpath': 'C:\\Windows\\System32\\alg.exe', 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing', 'display_name': 'Application Layer Gateway Service', 'name': 'alg', 'pid': None, 'start_type': 'manual', 'status': 'stopped', 'username': 'NT AUTHORITY\\LocalService'}


