Python系统信息案例如何实现?

wen python案例 1

本文目录导读:

  1. 安装必要库
  2. 完整系统信息收集案例
  3. 输出示例
  4. 跨平台注意事项
  5. 导出到文件

在Python中实现系统信息收集(CPU、内存、磁盘、网络等),常用的库包括 psutilplatformsocket 等,以下是完整的实现案例:

安装必要库

pip install psutil

完整系统信息收集案例

import psutil
import platform
import time
import socket
from datetime import datetime
def get_system_info():
    """获取系统基本信息"""
    info = {}
    # 操作系统信息
    info['os_name'] = platform.system()  # Windows/Linux/Darwin
    info['os_version'] = platform.version()
    info['os_release'] = platform.release()
    info['architecture'] = platform.machine()  # x86_64, arm64等
    info['hostname'] = socket.gethostname()
    info['python_version'] = platform.python_version()
    # 处理器信息
    info['processor'] = platform.processor()
    info['cpu_count_physical'] = psutil.cpu_count(logical=False)  # 物理核心数
    info['cpu_count_logical'] = psutil.cpu_count(logical=True)    # 逻辑核心数
    return info
def get_cpu_info():
    """获取CPU使用情况"""
    info = {}
    # CPU使用率(每秒采样3次取平均值)
    info['cpu_percent'] = psutil.cpu_percent(interval=1, percpu=False)
    # 每个CPU核心的使用率
    info['cpu_percent_per_core'] = psutil.cpu_percent(interval=1, percpu=True)
    # CPU频率
    cpu_freq = psutil.cpu_freq()
    if cpu_freq:
        info['cpu_freq_current'] = cpu_freq.current  # 当前频率(MHz)
        info['cpu_freq_min'] = cpu_freq.min           # 最小频率
        info['cpu_freq_max'] = cpu_freq.max           # 最大频率
    # CPU负载
    info['cpu_load_1min'] = psutil.getloadavg()[0] if hasattr(psutil, 'getloadavg') else None
    info['cpu_load_5min'] = psutil.getloadavg()[1] if hasattr(psutil, 'getloadavg') else None
    info['cpu_load_15min'] = psutil.getloadavg()[2] if hasattr(psutil, 'getloadavg') else None
    # CPU时间
    cpu_times = psutil.cpu_times_percent()
    info['cpu_user'] = cpu_times.user
    info['cpu_system'] = cpu_times.system
    info['cpu_idle'] = cpu_times.idle
    return info
def get_memory_info():
    """获取内存信息"""
    info = {}
    # 虚拟内存
    virtual_memory = psutil.virtual_memory()
    info['memory_total'] = virtual_memory.total  # 总内存(bytes)
    info['memory_available'] = virtual_memory.available  # 可用内存(bytes)
    info['memory_used'] = virtual_memory.used  # 已用内存(bytes)
    info['memory_percent'] = virtual_memory.percent  # 使用率(%)
    # 交换内存
    swap_memory = psutil.swap_memory()
    info['swap_total'] = swap_memory.total
    info['swap_used'] = swap_memory.used
    info['swap_free'] = swap_memory.free
    info['swap_percent'] = swap_memory.percent
    return info
def get_disk_info():
    """获取磁盘信息"""
    info = {}
    # 磁盘分区信息
    partitions = []
    for partition in psutil.disk_partitions():
        try:
            usage = psutil.disk_usage(partition.mountpoint)
            partition_info = {
                'device': partition.device,
                'mountpoint': partition.mountpoint,
                'fstype': partition.fstype,
                'total': usage.total,
                'used': usage.used,
                'free': usage.free,
                'percent': usage.percent
            }
            partitions.append(partition_info)
        except PermissionError:
            # 某些分区可能没有权限访问
            pass
    info['partitions'] = partitions
    # 磁盘I/O统计
    disk_io = psutil.disk_io_counters()
    if disk_io:
        info['disk_read_count'] = disk_io.read_count
        info['disk_write_count'] = disk_io.write_count
        info['disk_read_bytes'] = disk_io.read_bytes
        info['disk_write_bytes'] = disk_io.write_bytes
    return info
def get_network_info():
    """获取网络信息"""
    info = {}
    # 获取本机IP地址
    try:
        hostname = socket.gethostname()
        ip_address = socket.gethostbyname(hostname)
        info['hostname'] = hostname
        info['ip_address'] = ip_address
    except:
        pass
    # 网络接口信息
    net_if_addrs = psutil.net_if_addrs()
    interfaces = {}
    for interface_name, interface_addresses in net_if_addrs.items():
        addresses = []
        for addr in interface_addresses:
            address_info = {
                'family': str(addr.family),
                'address': addr.address,
                'netmask': addr.netmask,
                'broadcast': addr.broadcast
            }
            addresses.append(address_info)
        interfaces[interface_name] = addresses
    info['network_interfaces'] = interfaces
    # 网络I/O统计
    net_io = psutil.net_io_counters()
    info['bytes_sent'] = net_io.bytes_sent
    info['bytes_recv'] = net_io.bytes_recv
    info['packets_sent'] = net_io.packets_sent
    info['packets_recv'] = net_io.packets_recv
    # 网络连接数
    connections = psutil.net_connections()
    info['total_connections'] = len(connections)
    return info
def get_process_info(top_n=10):
    """获取进程信息,默认显示CPU占用最高的前10个进程"""
    processes = []
    for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
        try:
            process_info = proc.info
            # 过滤掉CPU使用率为0的进程(可选)
            if process_info['cpu_percent'] is not None:
                processes.append(process_info)
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            pass
    # 按CPU使用率排序
    processes.sort(key=lambda x: x['cpu_percent'], reverse=True)
    return processes[:top_n]
def format_bytes(bytes_value):
    """格式化字节数为人类可读格式"""
    for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
        if bytes_value < 1024.0:
            return f"{bytes_value:.2f} {unit}"
        bytes_value /= 1024.0
    return f"{bytes_value:.2f} PB"
def display_system_info():
    """显示系统信息的精美输出"""
    print("\n" + "=" * 60)
    print(f"系统信息报告 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)
    # 系统基本信息
    print("\n[基本系统信息]")
    system_info = get_system_info()
    for key, value in system_info.items():
        print(f"  {key}: {value}")
    # CPU信息
    print("\n[CPU信息]")
    cpu_info = get_cpu_info()
    print(f"  CPU使用率: {cpu_info['cpu_percent']:.1f}%")
    print(f"  各核心使用率: {[f'{x:.1f}%' for x in cpu_info['cpu_percent_per_core']]}")
    print(f"  用户态: {cpu_info['cpu_user']:.1f}%")
    print(f"  系统态: {cpu_info['cpu_system']:.1f}%")
    print(f"  空闲率: {cpu_info['cpu_idle']:.1f}%")
    # 内存信息
    print("\n[内存信息]")
    mem_info = get_memory_info()
    print(f"  总内存: {format_bytes(mem_info['memory_total'])}")
    print(f"  已使用: {format_bytes(mem_info['memory_used'])}")
    print(f"  可用内存: {format_bytes(mem_info['memory_available'])}")
    print(f"  内存使用率: {mem_info['memory_percent']:.1f}%")
    print(f"  交换空间: {format_bytes(mem_info['swap_total'])}")
    print(f"  交换使用率: {mem_info['swap_percent']:.1f}%")
    # 磁盘信息
    print("\n[磁盘信息]")
    disk_info = get_disk_info()
    for partition in disk_info['partitions']:
        print(f"  分区: {partition['device']} 挂载点: {partition['mountpoint']}")
        print(f"    文件系统: {partition['fstype']}")
        print(f"    总大小: {format_bytes(partition['total'])}")
        print(f"    已使用: {format_bytes(partition['used'])} ({partition['percent']:.1f}%)")
        print(f"    可用空间: {format_bytes(partition['free'])}")
    # 网络信息
    print("\n[网络信息]")
    net_info = get_network_info()
    print(f"  主机名: {net_info.get('hostname', 'N/A')}")
    print(f"  IP地址: {net_info.get('ip_address', 'N/A')}")
    print(f"  发送字节数: {format_bytes(net_info['bytes_sent'])}")
    print(f"  接收字节数: {format_bytes(net_info['bytes_recv'])}")
    print(f"  发送数据包: {net_info['packets_sent']}")
    print(f"  接收数据包: {net_info['packets_recv']}")
    print(f"  当前连接数: {net_info['total_connections']}")
    # 进程信息
    print("\n[Top 10 CPU占用进程]")
    processes = get_process_info(10)
    print(f"{'PID':<8} {'进程名':<30} {'CPU%':<10} {'内存%':<10}")
    print("-" * 58)
    for proc in processes:
        print(f"{proc['pid']:<8} {proc['name'][:30]:<30} "
              f"{proc['cpu_percent']:<10.1f} "
              f"{proc['memory_percent']:<10.1f}")
if __name__ == "__main__":
    # 运行系统信息收集
    display_system_info()
    # 如果需要实时监控,可以放在循环中
    print("\n\n开始实时监控(每5秒更新一次,按Ctrl+C停止)...")
    try:
        while True:
            # 获取当前CPU和内存使用率
            cpu_percent = psutil.cpu_percent(interval=1)
            memory_percent = psutil.virtual_memory().percent
            print(f"\r{datetime.now().strftime('%H:%M:%S')} - CPU: {cpu_percent:.1f}% | 内存: {memory_percent:.1f}%", end="")
    except KeyboardInterrupt:
        print("\n\n监控已停止。")

输出示例

============================================================
系统信息报告 - 2024-01-15 14:30:25
============================================================
[基本系统信息]
  os_name: Linux
  os_version: #1 SMP PREEMPT_DYNAMIC Fri Nov 10 13:34:49 UTC 2023
  os_release: 6.5.0-14-generic
  architecture: x86_64
  hostname: ubuntu-server
  python_version: 3.10.12
[CPU信息]
  CPU使用率: 23.5%
  各核心使用率: ['12.0%', '8.5%', '45.2%', '6.3%', '34.1%', '8.9%', '15.7%', '11.2%']
  用户态: 15.3%
  系统态: 8.2%
  空闲率: 76.5%
[内存信息]
  总内存: 15.56 GB
  已使用: 8.23 GB
  可用内存: 7.33 GB
  内存使用率: 52.9%
  交换空间: 2.00 GB
  交换使用率: 12.5%
...(更多详细信息)

跨平台注意事项

# Windows系统特殊处理
if platform.system() == "Windows":
    # Windows下某些信息获取方式不同
    import wmi  # 需要安装: pip install wmi
    def get_windows_specific_info():
        c = wmi.WMI()
        # 获取BIOS信息
        for bios in c.Win32_BIOS():
            print(f"BIOS版本: {bios.SMBIOSBIOSVersion}")
        # 获取显卡信息
        for gpu in c.Win32_VideoController():
            print(f"显卡: {gpu.Name}")

导出到文件

import json
def save_info_to_file(filename="system_info.json"):
    """将所有信息保存到JSON文件"""
    info = {
        'system': get_system_info(),
        'cpu': get_cpu_info(),
        'memory': get_memory_info(),
        'disk': get_disk_info(),
        'network': get_network_info(),
        'timestamp': datetime.now().isoformat()
    }
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(info, f, indent=2, ensure_ascii=False)
    print(f"系统信息已保存到 {filename}")

这个案例覆盖了全面的系统信息收集,包括基本信息、CPU、内存、磁盘、网络和进程等,并提供了实时监控和导出功能。

标签: 系统信息

抱歉,评论功能暂时关闭!