当前位置:首页 > Python > 正文

Python psutil模块使用教程 - 系统监控与进程管理 | Python系统编程指南

Python psutil模块使用教程

全面指南:监控系统资源、管理进程、获取硬件信息

什么是psutil模块?

psutil(process and system utilities)是一个跨平台库,用于在Python中获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息。

主要功能包括:

  • 获取CPU使用率
  • 监控内存使用情况
  • 查看磁盘IO和分区信息
  • 获取网络接口和流量统计
  • 管理系统进程
  • 获取系统启动时间和用户信息

安装psutil

使用pip安装psutil非常简单:

pip install psutil

支持的操作系统:Windows、Linux、macOS、FreeBSD等。

获取CPU信息

使用psutil获取CPU使用率和相关信息:

示例1:获取CPU使用率

import psutil

# 获取CPU使用率(间隔1秒)
cpu_percent = psutil.cpu_percent(interval=1)
print(f"当前CPU使用率: {cpu_percent}%")

# 获取每个CPU核心的使用率
cpu_percent_per_core = psutil.cpu_percent(interval=1, percpu=True)
for i, percent in enumerate(cpu_percent_per_core):
    print(f"CPU核心 {i} 使用率: {percent}%")

示例2:获取CPU统计信息

# 获取CPU频率
cpu_freq = psutil.cpu_freq()
print(f"当前频率: {cpu_freq.current}MHz")
print(f"最小频率: {cpu_freq.min}MHz")
print(f"最大频率: {cpu_freq.max}MHz")

# 获取CPU时间信息
cpu_times = psutil.cpu_times()
print(f"用户模式时间: {cpu_times.user}秒")
print(f"系统模式时间: {cpu_times.system}秒")
print(f"空闲时间: {cpu_times.idle}秒")

监控内存使用

psutil提供详细的内存使用信息:

示例3:获取内存使用情况

# 获取物理内存使用情况
mem = psutil.virtual_memory()
print(f"总内存: {mem.total / (1024 ** 3):.2f} GB")
print(f"可用内存: {mem.available / (1024 ** 3):.2f} GB")
print(f"已使用内存: {mem.used / (1024 ** 3):.2f} GB")
print(f"使用率: {mem.percent}%")

# 获取交换内存(虚拟内存)信息
swap = psutil.swap_memory()
print(f"交换内存总量: {swap.total / (1024 ** 3):.2f} GB")
print(f"已使用交换内存: {swap.used / (1024 ** 3):.2f} GB")
print(f"交换内存使用率: {swap.percent}%")

磁盘信息与IO监控

使用psutil获取磁盘分区信息和IO统计数据:

示例4:获取磁盘分区信息

# 获取磁盘分区信息
partitions = psutil.disk_partitions()
for partition in partitions:
    print(f"设备: {partition.device}")
    print(f"挂载点: {partition.mountpoint}")
    print(f"文件系统类型: {partition.fstype}")
    print("-----")
    
    # 获取磁盘使用情况
    try:
        usage = psutil.disk_usage(partition.mountpoint)
        print(f"总空间: {usage.total / (1024 ** 3):.2f} GB")
        print(f"已用空间: {usage.used / (1024 ** 3):.2f} GB")
        print(f"可用空间: {usage.free / (1024 ** 3):.2f} GB")
        print(f"使用率: {usage.percent}%")
    except PermissionError:
        # 有些分区可能没有权限访问
        continue

示例5:监控磁盘IO

# 获取磁盘IO统计
disk_io = psutil.disk_io_counters()
print(f"读取次数: {disk_io.read_count}")
print(f"写入次数: {disk_io.write_count}")
print(f"读取字节: {disk_io.read_bytes / (1024 ** 2):.2f} MB")
print(f"写入字节: {disk_io.write_bytes / (1024 ** 2):.2f} MB")

# 按磁盘分区获取IO统计
per_disk_io = psutil.disk_io_counters(perdisk=True)
for disk_name, disk_stats in per_disk_io.items():
    print(f"\n磁盘: {disk_name}")
    print(f"  读取次数: {disk_stats.read_count}")
    print(f"  写入次数: {disk_stats.write_count}")

网络信息与流量监控

psutil提供网络接口信息和流量统计:

示例6:获取网络接口信息

# 获取网络接口信息
net_if_addrs = psutil.net_if_addrs()
for interface, addrs in net_if_addrs.items():
    print(f"接口: {interface}")
    for addr in addrs:
        print(f"  地址族: {addr.family.name}")
        print(f"  地址: {addr.address}")
        print(f"  网络掩码: {addr.netmask}")
        print(f"  广播地址: {addr.broadcast}")
    print("-----")

示例7:监控网络流量

# 获取网络IO统计
net_io = psutil.net_io_counters()
print(f"发送字节: {net_io.bytes_sent / (1024 ** 2):.2f} MB")
print(f"接收字节: {net_io.bytes_recv / (1024 ** 2):.2f} MB")
print(f"发送包数: {net_io.packets_sent}")
print(f"接收包数: {net_io.packets_recv}")

# 按网络接口获取IO统计
per_net_io = psutil.net_io_counters(pernic=True)
for interface, stats in per_net_io.items():
    print(f"\n接口: {interface}")
    print(f"  发送字节: {stats.bytes_sent / 1024:.2f} KB")
    print(f"  接收字节: {stats.bytes_recv / 1024:.2f} KB")

进程管理

psutil强大的进程管理功能:

示例8:列出所有进程

# 获取所有进程ID
pids = psutil.pids()
print(f"系统中共有 {len(pids)} 个进程")

# 遍历所有进程
for pid in pids[:10]:  # 只显示前10个进程
    try:
        p = psutil.Process(pid)
        print(f"\n进程ID: {pid}")
        print(f"进程名称: {p.name()}")
        print(f"进程状态: {p.status()}")
        print(f"创建时间: {p.create_time()}")
        print(f"CPU使用率: {p.cpu_percent()}%")
        print(f"内存使用: {p.memory_info().rss / (1024 ** 2):.2f} MB")
    except psutil.NoSuchProcess:
        continue

示例9:终止进程

import psutil

# 查找特定名称的进程
target_process_name = "notepad.exe"

for proc in psutil.process_iter(['pid', 'name']):
    if proc.info['name'] == target_process_name:
        print(f"找到进程: {proc.info['pid']} - {proc.info['name']}")
        try:
            # 终止进程
            proc.terminate()
            print(f"已终止进程 {proc.info['pid']}")
        except psutil.NoSuchProcess:
            print("进程已不存在")
        except psutil.AccessDenied:
            print("权限不足,无法终止进程")

其他实用功能

psutil还提供许多其他实用功能:

示例10:获取系统启动时间和登录用户

import psutil
import datetime

# 获取系统启动时间
boot_time = psutil.boot_time()
print(f"系统启动时间: {datetime.datetime.fromtimestamp(boot_time).strftime('%Y-%m-%d %H:%M:%S')}")

# 获取当前登录用户
users = psutil.users()
for user in users:
    print(f"用户名: {user.name}")
    print(f"终端: {user.terminal}")
    print(f"登录时间: {datetime.datetime.fromtimestamp(user.started).strftime('%Y-%m-%d %H:%M:%S')}")

示例11:获取电池状态

# 获取电池信息(仅适用于笔记本电脑)
if hasattr(psutil, "sensors_battery"):
    battery = psutil.sensors_battery()
    if battery:
        print(f"电量百分比: {battery.percent}%")
        print(f"电源连接状态: {'已连接' if battery.power_plugged else '未连接'}")
        if battery.secsleft < 0:
            print("电池状态: 正在充电")
        else:
            print(f"剩余时间: {battery.secsleft // 3600}小时 {(battery.secsleft % 3600) // 60}分钟")
else:
    print("此系统没有电池信息")

实际应用:系统监控工具

结合以上功能,创建一个简单的系统监控工具:

示例12:实时系统监控

import psutil
import time

def monitor_system(interval=2):
    """实时监控系统资源使用情况"""
    try:
        while True:
            # 清屏
            print("\033c", end="")
            
            # CPU使用率
            cpu_percent = psutil.cpu_percent(interval=None)
            print(f"CPU使用率: {cpu_percent}%")
            
            # 内存使用
            mem = psutil.virtual_memory()
            print(f"内存使用: {mem.percent}% ({mem.used / (1024 ** 3):.2f} GB / {mem.total / (1024 ** 3):.2f} GB)")
            
            # 磁盘使用
            disk = psutil.disk_usage('/')
            print(f"根分区使用率: {disk.percent}%")
            
            # 网络流量
            net_io = psutil.net_io_counters()
            print(f"网络发送: {net_io.bytes_sent / 1024:.2f} KB | 接收: {net_io.bytes_recv / 1024:.2f} KB")
            
            # 进程数量
            print(f"运行中进程数: {len(psutil.pids())}")
            
            # 间隔时间
            time.sleep(interval)
            
    except KeyboardInterrupt:
        print("\n监控已停止")

# 启动监控
monitor_system()

总结

psutil是Python中用于系统监控和进程管理的强大工具,通过本教程,我们学习了:

  • 如何安装和使用psutil模块
  • 监控CPU、内存、磁盘和网络使用情况
  • 管理系统进程(查找、终止进程)
  • 获取系统信息(启动时间、登录用户等)
  • 创建实时系统监控工具

psutil在系统监控、性能分析、资源管理等方面有广泛应用,是Python系统编程不可或缺的工具。

发表评论