psutil模块—获取硬件资源数据,如CPU,GPU,内存,磁盘等

我们将使用psutil来获取电脑硬件资源数据

1. psutil介绍

安装psutil模块
pip install psutil
如果下载过慢,可以使用豆瓣源进行下载
pip install psutil -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

  • -i 表示要用豆瓣下载源进行下载
  • --trusted-host 表示信任主机

2. 获取CPU信息

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}

3. 获取GPU信息

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'}

4. 获取内存与交换分区信息

# 字节数转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'}

5. 获取网卡信息

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}]

6. 用户最近登录时间

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~

你可能感兴趣的:(Python,python)