> 技术文档 > 进阶向:基于Python的电脑硬件监控工具(GUI + 系统信息采集)

进阶向:基于Python的电脑硬件监控工具(GUI + 系统信息采集)


引言

在科技飞速发展的今天,人工智能已经渗透到我们生活的方方面面,从基础的日常沟通到复杂的商业决策,智能技术的影响力正在以惊人的速度扩大。以自然语言处理为例,智能助手不仅能理解人类的日常对话,还能通过情感分析提供个性化的回应;在医疗领域,AI辅助诊断系统的准确率已达到专业医师水平,极大地提高了早期疾病筛查的效率。

面对这场深刻的技术变革,理解其背后的逻辑与应用场景变得至关重要。从技术角度看,机器学习算法的进步(如深度学习、强化学习)为AI应用提供了强大的计算基础;从应用层面看,智能推荐系统正在重塑电商和内容平台的用户体验,而自动驾驶技术则有望彻底改变未来的交通方式。这些发展都彰显出AI技术的巨大潜力。

通过深入探讨核心原理与实践案例,我们可以更清晰地把握技术趋势。例如,分析计算机视觉在安防监控中的实际应用,或研究预测算法在金融风控中的具体表现,都能帮助我们理解不同场景下的技术适配性。这种理解不仅有助于发掘潜在商业价值,更能为未来的技术创新与产业突破奠定坚实基础。随着5G、边缘计算等配套技术的发展,AI的应用边界还将持续扩展,带来更多令人期待的可能性。

核心库选择

GPUtil专门用于获取NVIDIA GPU信息

platform模块提供基本的系统识别功能:

GUI开发选项对比:

tkinter(Python标准库):

PyQt5/PySide6(第三方库):

  • psutil(Python System and Process Utilities)是一个跨平台的系统监控库,可以获取系统运行时的各种关键信息:

  • CPU相关:

    • 使用率(psutil.cpu_percent())
    • 核心数量(psutil.cpu_count())
    • 温度监控(部分平台支持)
    • 示例:监控CPU负载并设置告警阈值
  • 内存管理:

    • 物理内存总量及使用情况(psutil.virtual_memory())
    • 交换分区信息(psutil.swap_memory())
    • 示例:实时显示内存使用曲线图
  • 磁盘信息:

    • 分区信息(psutil.disk_partitions())
    • 使用情况(psutil.disk_usage())
    • IO统计(psutil.disk_io_counters())
    • 示例:监控磁盘剩余空间并预警
  • 网络监控:

    • 网络接口信息(psutil.net_if_addrs())
    • IO统计(psutil.net_io_counters())
    • 连接信息(psutil.net_connections())
  • 显存使用情况
  • GPU温度监控
  • 负载百分比
  • 示例:深度学习训练时的GPU监控面板
  • 操作系统类型(platform.system())
  • 系统版本(platform.version())
  • 处理器架构(platform.machine())
  • 示例:生成系统诊断报告
  • 优势:无需额外安装,适合简单界面
  • 缺点:界面较简陋,功能有限
  • 示例应用:基础系统监控仪表盘
  • 优势:
    • 丰富的UI组件(表格、图表等)
    • 支持多线程
    • 现代化界面设计
  • 缺点:
    • 需要单独安装
    • 学习曲线较陡
  • 示例应用:
    • 专业级系统监控工具
    • 带历史数据可视化的性能分析器

基本系统信息采集实现

import psutilimport platformfrom datetime import datetimedef get_system_info(): # CPU信息 cpu_percent = psutil.cpu_percent(interval=1) cpu_count = psutil.cpu_count(logical=False) cpu_logical = psutil.cpu_count(logical=True) # 内存信息 mem = psutil.virtual_memory() mem_total = round(mem.total / (1024**3), 2) mem_used = round(mem.used / (1024**3), 2) mem_percent = mem.percent # 磁盘信息 disk = psutil.disk_usage(\'/\') disk_total = round(disk.total / (1024**3), 2) disk_used = round(disk.used / (1024**3), 2) disk_percent = disk.percent # 系统信息 system_info = { \"system\": platform.system(), \"node\": platform.node(), \"release\": platform.release(), \"version\": platform.version(), \"machine\": platform.machine(), \"boot_time\": datetime.fromtimestamp(psutil.boot_time()).strftime(\"%Y-%m-%d %H:%M:%S\") } return { \"cpu\": { \"percent\": cpu_percent, \"cores_physical\": cpu_count, \"cores_logical\": cpu_logical }, \"memory\": { \"total\": mem_total, \"used\": mem_used, \"percent\": mem_percent }, \"disk\": { \"total\": disk_total, \"used\": disk_used, \"percent\": disk_percent }, \"system\": system_info }

添加GPU监控功能

try: import GPUtil def get_gpu_info(): gpus = GPUtil.getGPUs() if gpus: return { \"name\": gpus[0].name, \"load\": gpus[0].load * 100, \"memory_used\": round(gpus[0].memoryUsed, 1), \"memory_total\": round(gpus[0].memoryTotal, 1), \"temperature\": gpus[0].temperature } return Noneexcept ImportError: def get_gpu_info(): return None

使用Tkinter构建简单GUI

import tkinter as tkfrom tkinter import ttkclass HardwareMonitor(tk.Tk): def __init__(self): super().__init__() self.title(\"硬件监控工具\") self.geometry(\"600x400\") # 创建标签框架 self.cpu_frame = ttk.LabelFrame(self, text=\"CPU 信息\") self.mem_frame = ttk.LabelFrame(self, text=\"内存 信息\") self.disk_frame = ttk.LabelFrame(self, text=\"磁盘 信息\") self.sys_frame = ttk.LabelFrame(self, text=\"系统 信息\") # 布局 self.cpu_frame.pack(fill=\"both\", expand=True, padx=5, pady=5) self.mem_frame.pack(fill=\"both\", expand=True, padx=5, pady=5) self.disk_frame.pack(fill=\"both\", expand=True, padx=5, pady=5) self.sys_frame.pack(fill=\"both\", expand=True, padx=5, pady=5) # 添加标签 self.cpu_label = ttk.Label(self.cpu_frame, text=\"\") self.mem_label = ttk.Label(self.mem_frame, text=\"\") self.disk_label = ttk.Label(self.disk_frame, text=\"\") self.sys_label = ttk.Label(self.sys_frame, text=\"\") self.cpu_label.pack() self.mem_label.pack() self.disk_label.pack() self.sys_label.pack() self.update_data() def update_data(self): data = get_system_info() gpu_data = get_gpu_info() # 更新CPU信息 cpu_text = f\"使用率: {data[\'cpu\'][\'percent\']}% | 物理核心: {data[\'cpu\'][\'cores_physical\']} | 逻辑核心: {data[\'cpu\'][\'cores_logical\']}\" self.cpu_label.config(text=cpu_text) # 更新内存信息 mem_text = f\"使用: {data[\'memory\'][\'used\']}GB / {data[\'memory\'][\'total\']}GB ({data[\'memory\'][\'percent\']}%)\" self.mem_label.config(text=mem_text) # 更新磁盘信息 disk_text = f\"使用: {data[\'disk\'][\'used\']}GB / {data[\'disk\'][\'total\']}GB ({data[\'disk\'][\'percent\']}%)\" self.disk_label.config(text=disk_text) # 更新系统信息 sys_text = f\"系统: {data[\'system\'][\'system\']} {data[\'system\'][\'release\']} | 主机名: {data[\'system\'][\'node\']} | 启动时间: {data[\'system\'][\'boot_time\']}\" self.sys_label.config(text=sys_text) # 如果有GPU信息则显示 if gpu_data: if not hasattr(self, \'gpu_frame\'): self.gpu_frame = ttk.LabelFrame(self, text=\"GPU 信息\") self.gpu_frame.pack(fill=\"both\", expand=True, padx=5, pady=5) self.gpu_label = ttk.Label(self.gpu_frame, text=\"\") self.gpu_label.pack() gpu_text = f\"{gpu_data[\'name\']} | 负载: {gpu_data[\'load\']:.1f}% | 显存: {gpu_data[\'memory_used\']}GB/{gpu_data[\'memory_total\']}GB | 温度: {gpu_data[\'temperature\']}°C\" self.gpu_label.config(text=gpu_text) self.after(1000, self.update_data)

使用PyQt5构建更专业的界面

from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QTabWidget, QProgressBar)from PyQt5.QtCore import QTimerimport sysclass QtHardwareMonitor(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(\"硬件监控工具\") self.setGeometry(100, 100, 800, 600) self.central_widget = QWidget() self.setCentralWidget(self.central_widget) self.layout = QVBoxLayout(self.central_widget) self.tabs = QTabWidget() self.layout.addWidget(self.tabs) # 创建标签页 self.cpu_tab = QWidget() self.mem_tab = QWidget() self.disk_tab = QWidget() self.sys_tab = QWidget() self.tabs.addTab(self.cpu_tab, \"CPU\") self.tabs.addTab(self.mem_tab, \"内存\") self.tabs.addTab(self.disk_tab, \"磁盘\") self.tabs.addTab(self.sys_tab, \"系统\") # 初始化UI self.init_cpu_tab() self.init_mem_tab() self.init_disk_tab() self.init_sys_tab() # 定时更新 self.timer = QTimer() self.timer.timeout.connect(self.update_data) self.timer.start(1000) def init_cpu_tab(self): layout = QVBoxLayout(self.cpu_tab) self.cpu_label = QLabel(\"CPU 信息\") self.cpu_progress = QProgressBar() layout.addWidget(self.cpu_label) layout.addWidget(self.cpu_progress) def update_data(self): data = get_system_info() # 更新CPU信息 cpu_text = f\"CPU 使用率: {data[\'cpu\'][\'percent\']}% | 物理核心: {data[\'cpu\'][\'cores_physical\']} | 逻辑核心: {data[\'cpu\'][\'cores_logical\']}\" self.cpu_label.setText(cpu_text) self.cpu_progress.setValue(data[\'cpu\'][\'percent\']) # 更新其他标签页...

高级功能扩展

实时图表显示 使用matplotlib可以创建实时更新的硬件使用率图表:

from matplotlib.backends.backend_tkagg import FigureCanvasTkAggfrom matplotlib.figure import Figureclass ChartMonitor(tk.Tk): def __init__(self): super().__init__() self.title(\"硬件监控图表\") # 创建图表 self.fig = Figure(figsize=(5, 4), dpi=100) self.ax = self.fig.add_subplot(111) # 初始化数据 self.x_data = list(range(60)) self.y_data = [0] * 60 # 创建画布 self.canvas = FigureCanvasTkAgg(self.fig, master=self) self.canvas.draw() self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) self.update_chart() def update_chart(self): # 获取当前CPU使用率 cpu_percent = psutil.cpu_percent(interval=1) # 更新数据 self.y_data.append(cpu_percent) if len(self.y_data) > 60: self.y_data.pop(0) # 清除并重新绘制 self.ax.clear() self.ax.plot(self.x_data, self.y_data[-60:], \'r-\') self.ax.set_ylim(0, 100) self.ax.set_title(\"CPU 使用率 (%)\") self.ax.set_xlabel(\"时间 (秒)\") self.canvas.draw() self.after(1000, self.update_chart)

网络监控功能 可以扩展网络监控功能:

def get_network_info(): net_io = psutil.net_io_counters() return { \"bytes_sent\": net_io.bytes_sent, \"bytes_recv\": net_io.bytes_recv, \"packets_sent\": net_io.packets_sent, \"packets_recv\": net_io.packets_recv }

打包为可执行文件

使用PyInstaller可以将应用打包为独立可执行文件:

pip install pyinstallerpyinstaller --onefile --windowed hardware_monitor.py

这些方法提供了从简单到高级的硬件监控实现方案,可以根据需求选择合适的组件进行组合或扩展。具体来说:

  1. 基础监控方案
    适用于入门级需求,主要包含:

    • CPU/GPU温度监控(如使用lm-sensors工具)
    • 内存使用率统计(通过free -m命令)
    • 磁盘空间检查(df -h命令) 应用场景:个人开发者调试或小型服务器基础运维
  2. 中级监控方案
    增加实时性和可视化能力:

    • 使用Prometheus+Grafana搭建监控仪表盘
    • 集成网络流量监控(如nload工具)
    • 添加SMART硬盘健康检测 典型配置示例
    # Prometheus配置片段scrape_configs: - job_name: \'node\' static_configs: - targets: [\'192.168.1.100:9100\']
  3. 高级企业级方案
    包含自动化预警和分布式监控:

    • 部署ZabbixNagios监控集群
    • 实现SNMP协议设备管理
    • 定制化开发监控插件(如通过Python编写硬件探针) 扩展建议
    • 对关键业务服务器配置双通道监控
    • 建立分级告警机制(邮件/短信/企业微信通知)
  4. 特殊场景方案

    • 工业环境:增加4-20mA信号采集模块
    • 边缘计算:部署轻量级Telegraf代理
    • 高安全要求:采用硬件加密的监控数据链路

方案选择时需综合考虑硬件规模(单机/集群)、监控粒度(秒级/分钟级)以及预算成本。建议从基础方案开始,逐步按需扩展功能模块。