本文目录导读:
在Python中实现系统信息收集(CPU、内存、磁盘、网络等),常用的库包括 psutil、platform、socket 等,以下是完整的实现案例:
安装必要库
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、内存、磁盘、网络和进程等,并提供了实时监控和导出功能。
标签: 系统信息