我们将使用psutil来获取电脑硬件资源数据
安装psutil模块
pip install psutil
如果下载过慢,可以使用豆瓣源进行下载
pip install psutil -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
-i
表示要用豆瓣下载源进行下载--trusted-host
表示信任主机import winreg # winreg 是注册表控制模块
import psutil
def cpu():
# 打开注册表
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"HARDWARE\DESCRIPTION\System\CentralProcessor\0")
# QueryValueEx 获取指定注册表中指定字段的内容
cpu_name = winreg.QueryValueEx(key, "ProcessorNameString") # 获取cpu名称
key.Close()
data = dict(
cpu_name=cpu_name[0],
cpu_avg=psutil.cpu_percent(interval=0, percpu=False), # cpu平均使用率
per_cpu_avg=psutil.cpu_percent(interval=0, percpu=True), # 每个cpu使用率
cpu_core=psutil.cpu_count(False), # cpu物理核心数量
cpu_logic=psutil.cpu_count(True) # cpu逻辑核心数量
)
return data
运行结果
{'cpu_name': 'Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz', 'cpu_avg': 70.0, 'per_cpu_avg': [50.0, 66.7, 50.0, 100.0], 'cpu_core': 2, 'cpu_logic': 4}
import pynvml
# 字节数转GB
def bytes_to_gb(sizes):
sizes = round(sizes / (1024 ** 3), 2)
return f"{sizes} GB"
def gpu():
pynvml.nvmlInit()
gpu_count = pynvml.nvmlDeviceGetCount(), # 显卡数量
if len(gpu_count) > 1: # 如果有多张显卡
for i in range(len(gpu_count)):
handle = pynvml.nvmlDeviceGetHandleByIndex(i)
gpu_name = pynvml.nvmlDeviceGetName(handle=handle)
gpu_memory = pynvml.nvmlDeviceGetMemoryInfo(handle=handle)
handle = pynvml.nvmlDeviceGetHandleByIndex(0) # 显卡句柄(只有一张显卡)
gpu_name = pynvml.nvmlDeviceGetName(handle) # 显卡名称
gpu_memory = pynvml.nvmlDeviceGetMemoryInfo(handle) # 显卡内存信息
data = dict(
gpu_name=gpu_name.decode("utf-8"),
gpu_count=len(gpu_count),
gpu_memory_total=bytes_to_gb(gpu_memory.total),
gpu_memory_used=bytes_to_gb(gpu_memory.used),
gpu_memory_free=bytes_to_gb(gpu_memory.free),
)
return data
运行结果
{'gpu_name': 'GeForce MX150', 'gpu_count': 1, 'gpu_memory_total': '2.0 GB', 'gpu_memory_used': '0.06 GB', 'gpu_memory_free': '1.94 GB'}
# 字节数转GB
def bytes_to_gb(sizes):
sizes = round(sizes / (1024 ** 3), 2)
return f"{sizes} GB"
def menory():
data = dict(
menory_total=psutil.virtual_memory().total, # 内容总量
menory_available=psutil.virtual_memory().available, # 内容可用量
menory_percent=psutil.virtual_memory().percent, # 内存使用率
menory_used=psutil.virtual_memory().used, # 内存使用量
)
return data
def swap():
data = dict(
swap_total=bytes_to_gb(psutil.swap_memory().total), # 交换分区总容量
swap_used=bytes_to_gb(psutil.swap_memory().used), # 交换分区使用量
swap_free=bytes_to_gb(psutil.swap_memory().free), # 交换分区剩余量
swap_percent=bytes_to_gb(psutil.swap_memory().percent), # 交换分区使用率
)
return data
运行结果
{'menory_total': 8494747648, 'menory_available': 2043375616, 'menory_percent': 75.9, 'menory_used': 6451372032}
{'swap_total': '11.91 GB', 'swap_used': '8.32 GB', 'swap_free': '3.6 GB', 'swap_percent': '0.0 GB'}
def net():
# 获取地址信息
addrs = psutil.net_if_addrs()
# val.family.name取出协议地址族名称,AF_INET(ipv4)
addrs_info = {
k: [
dict(
family=val.family.name, # 协议名称
address=val.address, # ip地址
netmask=val.netmask, # 子网掩码
broadcast=val.broadcast # 网关
)
for val in v if val.family.name == "AF_INET"
][0]
for k, v in addrs.items()
}
# 获取输入输出信息(收发包数,收发字节数)
io = psutil.net_io_counters(pernic=True)
data = [
dict(
name=k,
bytes_sent=v.bytes_sent, # 发送字节数量
bytes_recv=v.bytes_recv, # 接受字节数量
packets_sent=v.packets_sent,
packets_recv=v.packets_recv,
**addrs_info[k]
)
for k, v in io.items()
]
return data
运行结果
[{'name': '本地连接* 1', 'bytes_sent': 0, 'bytes_recv': 0, 'packets_sent': 0, 'packets_recv': 0, 'family': 'AF_INET', 'address': '169.254.230.83', 'netmask': '255.255.0.0', 'broadcast': None},
{'name': '本地连接* 10', 'bytes_sent': 0, 'bytes_recv': 0, 'packets_sent': 0, 'packets_recv': 0, 'family': 'AF_INET', 'address': '169.254.63.68', 'netmask': '255.255.0.0', 'broadcast': None},
{'name': 'VMware Network Adapter VMnet1', 'bytes_sent': 2043, 'bytes_recv': 0, 'packets_sent': 2043, 'packets_recv': 0, 'family': 'AF_INET', 'address': '169.254.27.2', 'netmask': '255.255.0.0', 'broadcast': None},
{'name': 'VMware Network Adapter VMnet8', 'bytes_sent': 1482, 'bytes_recv': 0, 'packets_sent': 1482, 'packets_recv': 0, 'family': 'AF_INET', 'address': '192.168.100.1', 'netmask': '255.255.255.0', 'broadcast': None},
{'name': 'WLAN', 'bytes_sent': 6488334, 'bytes_recv': 140695210, 'packets_sent': 37689, 'packets_recv': 122141, 'family': 'AF_INET', 'address': '192.168.43.141', 'netmask': '255.255.255.0', 'broadcast': None},
{'name': 'Loopback Pseudo-Interface 1', 'bytes_sent': 0, 'bytes_recv': 0, 'packets_sent': 0, 'packets_recv': 0, 'family': 'AF_INET', 'address': '127.0.0.1', 'netmask': '255.0.0.0', 'broadcast': None}]
import datetime
# 时间戳转化为时间字符方法
def td(tm):
dt = datetime.datetime.fromtimestamp(tm)
return dt.strftime("%Y-%m-%d %H:%M:%S")
# 获取当前日期时间
def dt():
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 上次开机时间
def last_boot_time():
# psutil.boot_time() 返回的是时间戳
return td(psutil.boot_time())
# 上次登录用户信息
def logined_users():
users = psutil.users()
data = [
dict(
name=v.name, # 登录用户名
terminal=v.terminal, # 登录终端
host=v.host, # 登录主机
started=self.td(v.started), # 登录时间
pid=v.pid # 进程号
)
for v in users
]
return data
运行结果
# 上次登录用户信息结果 #
[{'name': 'rion', 'terminal': None, 'host': None, 'started': '2021-08-05 23:19:47', 'pid': None}]
以上就是psutil的基本使用,本来还想统计CPU的实时频率速度,但是不知道写。有知道大佬可以下评论区留言哦,谢谢!
后面可能会考虑做一个实时的资源监控,使用Django来制作,bye~