psutil( Python 系统和进程实用程序)是一个跨平台库,用于检索 Python 中运行进程和系统利用率(CPU、内存、磁盘、网络、传感器)的信息。它主要用于系统监视、分析、限制进程资源和管理正在运行的进程。它实现了 UNIX 命令行工具提供的许多功能,例如:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap。psutil 目前支持 Linux、Windows、macOS、FreeBSD/penBSD/ NetBSD、Sun Solaris、AIX 等平台。
psutil 支持的 Python 版本为 2.7 和 3.4+,在 Linux、Windows、macOS 下载方式:
pip install psutil
接下来,梳理下 CPU、内存、磁盘、网络等有关的函数及使用API。
CPU 有关的函数:
函数名称 |
函数作用 |
其他说明 |
|
将系统CPU时间作为命名元组返回 |
当percpu为True时,返回系统上每个逻辑CPU的命名元组列表。列表的第一个元素指向第一个CPU,第二个元素指向第二个CPU,依此类推。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
使用演示:(当前测试平台 --- Windows)
import psutil
# scputimes(user=2240.359305, system=2669.05, idle=20536.234305, interrupt=174.21805, dpc=443.953125)
print(psutil.cpu_times())
# 0.0
print(psutil.cpu_percent())
# scputimes(user=0.0, system=0.0, idle=0.0, interrupt=0.0, dpc=0.0)
print(psutil.cpu_times_percent())
# scpustats(ctx_switches=82697106, interrupts=58590008, soft_interrupts=0, syscalls=331427222)
print(psutil.cpu_stats())
# 8
print(psutil.cpu_count())
# scpufreq(current=1792.0, min=0.0, max=1992.0)
print(psutil.cpu_freq())
# (0.0, 0.0, 0.0)
print(psutil.getloadavg())
从这里可以看到,CPU配置信息为:八核,CPU最大频率1992MHZ,当前频率为1792MHZ 等。
Memory 可分为虚拟内存和交换内存,有以下两个函数:
①、virtual_memory():以命名元组的形式返回有关系统内存使用情况的统计信息(以字节为单位),主要指标有:
# 当前测试平台,Windows
# svmem(total=8434085888, available=1996607488, percent=76.3, used=6437478400, free=1996607488)
print(psutil.virtual_memory())
②、swap_memory():将系统交换内存统计信息作为命名元组返回(以字节为单位),包括以下字段:
# 当前测试平台,Windows
# sswap(total=15144972288, used=8803577856, free=6341394432, percent=58.1, sin=0, sout=0)
print(psutil.swap_memory())
--> disk_partitions(): 以命名元组的形式返回所有挂载的磁盘分区信息,包括设备,挂载点,文件系统类型等。如果在 Linux 平台,类似使用df命令。
--> disk_usage(path): 返回有关分区的磁盘使用情况统计信息,该分区包含作为命名元组的给定路径,包括以字节表示的总空间、已用空间和可用空间,以及使用百分比。
--> disk_io_counters(): 以命名元组的形式返回系统范围的磁盘I/O统计信息(包括 read_count, write_count, read_bytes, write_bytes, read_time, write_time 等字段)。
# 当前测试平台,Windows
# [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260)]
print(psutil.disk_partitions())
# sdiskusage(total=161051269304, used=48602433888, free=112459735616, percent=31.2)
print(psutil.disk_usage("/"))
# sdiskio(read_count=800572, write_count=166800, read_bytes=26395607296, write_bytes=7520133392, read_time=814, write_time=97)
print(psutil.disk_io_counters())
--> net_io_counters(): 以命名元组的形式返回系统范围内的网络I/O统计信息。
--> net_connections(): 将系统范围的套接字连接作为命名元组的列表返回。
# 当前测试平台,Windows
#snetio(bytes_sent=1665035507, bytes_recv=16602087092, packets_sent=11453498, packets_recv=14149630, errin=0, errout=0, dropin=0, dropout=0)
print(psutil.net_io_counters())
#[sconn(fd=-1, family=, type=, laddr=addr(ip='0.0.0.0', port=49685), raddr=(), status='LISTEN', pid=4404)]
print(psutil.net_connections())
--> net_if_addrs(): 以字典的形式返回系统上安装的每个网口关联地址信息。
--> net_if_stats(): 以字典的形式返回系统上安装的每个网口信息(isup-标识网口是否正常启动并运行中,duplex-双工通信类型,speed-传输速度,mtu-最大传输字节,flags-网口的标志)。
# 当前测试平台,Windows
#{'本地连接* 3': [snicaddr(family=, address='82-91-33-91-F1-BD', netmask=None, broadcast=None, ptp=None), snicaddr(family=, address='169.254.163.103', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=, address='fe80::aa55:ee0f:3f9e:e5f0', netmask=None, broadcast=None, ptp=None)]}
print(psutil.net_if_addrs())
#{'本地连接* 3': snicstats(isup=False, duplex=, speed=0, mtu=1500)}
print(psutil.net_if_stats())
--> pids():返回当前运行pid的列表(有序)。
--> process_iter(): 返回一个迭代器,为本地计算机上所有正在运行的进程生成一个 Process 类实例。这应该优先于 pids() 方法来迭代进程,因为它不受竞争条件的影响。
--> pid_exists(pid):查找指定的 pid 是否存在于当前运行pid的列表。
--> users():以命名元组的形式返回系统上当前连接的用户。
--> boot_time():返回自epoch以来的系统启动时间(以秒为单位)。
以上就是这个模块大部分的API,有些还是挺实用的,在此记录一下。
参考资料:
psutil documentation — psutil 5.9.5 documentation