一、概要:
psutil(进程和系统实用程序)是一个跨平台库,用于 在Python中检索有关正在运行的进程和系统利用率(CPU,内存,磁盘,网络,传感器)的信息。它主要用于系统监视,分析和限制流程资源以及运行流程的管理。它实现了UNIX命令行工具提供的许多功能,例如:ps,top,lsof,netstat,ifconfig,who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。psutil目前支持以下平台:
- linux;
- windows;
- mac os
- FreeBSD, OpenBCD, NetBsd;
- AIX;
- …
支持32位和64位的架构;
支持python>=2.6; python>=3.4
二、安装:
github: https://github.com/giampaolo/psutil
pypi: https://pypi.org/project/psutil/
使用pip包管理利器直接安装:
pip install psutil
三、具体实例
1. CPU:
# coding=utf-8
import psutil
# 去获取cpu的详细信息
cpus = psutil.cpu_times()
print("CPU的详细信息:{}".format(cpus))
# psutil获取系统cpu使用率的方法是cpu_percent()
# 两个参数,分别是interval和percpu,
# interval指定的是计算cpu使用率的时间间隔,
# percpu则指定是选择总的使用率还是每个cpu的使用率。(默认为False)
percent = psutil.cpu_percent(interval=1)
print(f"当前CPU总使用率为:{percent}%")
percent = psutil.cpu_percent(interval=1, percpu=True)
print(f"当前每个CPU使用率为:{percent}")
# cpu详细使用率
times_percent = psutil.cpu_times_percent(interval=1, percpu=False)
print(f"当前CPU总详细使用率为:{times_percent}%")
# cpu核数
logical_count = psutil.cpu_count()
print(f"CPU逻辑核数:{logical_count}")
cpu_count = psutil.cpu_count(logical=False)
print(f"CPU物理核数:{logical_count}")
# cpu状态
stats = psutil.cpu_stats()
print(f"cpu当前状态:{stats}")
# cpu频率
freq = psutil.cpu_freq()
print(f"cpu的频率:{freq}")
结果:
CPU的详细信息:scputimes(user=1134.52, nice=7.61, system=555.98, idle=15817.17, iowait=41.83, irq=0.0, softirq=27.35, steal=0.0, guest=0.0, guest_nice=0.0)
当前CPU总使用率为:1.5%
当前每个CPU使用率为:[19.2, 19.4, 16.3, 13.1]
当前CPU总详细使用率为:scputimes(user=9.6, nice=0.0, system=5.1, idle=84.8, iowait=0.3, irq=0.0, softirq=0.3, steal=0.0, guest=0.0, guest_nice=0.0)%
CPU逻辑核数:4
CPU物理核数:22
cpu当前状态:scpustats(ctx_switches=11882258, interrupts=6862862, soft_interrupts=3863165, syscalls=0)
cpu的频率:scpufreq(current=931.42925, min=800.0, max=3500.0)
2.内存:
#coding=utf-8
import psutil
# 虚拟内存 总内存
virtual = psutil.virtual_memory()
print(f"虚拟内存信息:{virtual}")
# 交换分区
swap = psutil.swap_memory()
print(f"交换分区:{swap}")
结果:
虚拟内存信息:svmem(total=8339914752, available=4141465600, percent=50.3, used=3977195520, free=1327108096, active=3962109952, inactive=1365458944, buffers=316178432, cached=2719432704, shared=89669632, slab=702013440)
交换分区:sswap(total=2147479552, used=0, free=2147479552, percent=0.0, sin=0, sout=0)
3.硬盘:
#coding=utf-8
import psutil
# 获取硬盘信息
disk = psutil.disk_partitions()
print(f"硬盘的信息:{disk}")
# 获取分区状态
usage = psutil.disk_usage('/')
print(f"'/'分区状态:{usage}")
# 获取单个分区的IO个数
io_counters = psutil.disk_io_counters(perdisk=False)
print(f"单个分区的io个数:{io_counters}")
结果:
硬盘的信息:[sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,relatime,errors=remount-ro,data=ordered')]
'/'分区状态:sdiskusage(total=63142932480, used=23225364480, free=36679671808, percent=38.8)
单个分区的io个数:sdiskio(read_count=95823, write_count=61962, read_bytes=1900379136, write_bytes=1490157568, read_time=156552, write_time=247832, read_merged_count=28869, write_merged_count=85194, busy_time=56828)
4.网络:
# coding=utf-8
import psutil
# 获取网络读写字节/包的个数
io_counters = psutil.net_io_counters()
print(f"网络读写字节/包的个数:{io_counters}")
# 输出网络每个接口读写字节/包的个数
print("网络每个接口读写字节/包的个数:")
counters = psutil.net_io_counters(pernic=True)
for port, value in counters.items():
print(f"{port}:{value}")
# 获取网络接口信息
print("获取网络接口信息:")
if_addrs = psutil.net_if_addrs()
for port, value in if_addrs.items():
print(f"{port}:{value}")
# 获取网络接口状态
print("获取网络接口状态:")
if_stats = psutil.net_if_stats()
for port, value in if_stats.items():
print(f"{port}:{value}")
结果:
网络读写字节/包的个数:snetio(bytes_sent=6802690, bytes_recv=54851021, packets_sent=33268, packets_recv=63304, errin=0, errout=0, dropin=0, dropout=0)
网络每个接口读写字节/包的个数:
ens33:snetio(bytes_sent=6227927, bytes_recv=54276258, packets_sent=27193, packets_recv=57229, errin=0, errout=0, dropin=0, dropout=0)
lo:snetio(bytes_sent=574763, bytes_recv=574763, packets_sent=6075, packets_recv=6075, errin=0, errout=0, dropin=0, dropout=0)
获取网络接口信息:
lo:[snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, 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_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)]
ens33:[snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.116.131', netmask='255.255.255.0', broadcast='192.168.116.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::71b0:76ea:7c56:e6c1%ens33', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:95:e8:f1', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]
获取网络接口状态:
ens33:snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500)
lo:snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536)
5. 传感器(温度、风扇、电池)
# coding=utf-8
import psutil
temperatures = psutil.sensors_temperatures()
print(temperatures)
fans = psutil.sensors_fans()
print(fans)
battery = psutil.sensors_battery()
print(battery)
结果:
{'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)]}
{'asus': [sfan(label='cpu_fan', current=3200)]}
sbattery(percent=93, secsleft=16628, power_plugged=False)
还有一些, 不太常用了.就不写了…