基于Python開發(fā)電腦硬件監(jiān)控工具
引言
在科技飛速發(fā)展的今天,人工智能已經(jīng)滲透到我們生活的方方面面,從基礎(chǔ)的日常溝通到復(fù)雜的商業(yè)決策,智能技術(shù)的影響力正在以驚人的速度擴大。以自然語言處理為例,智能助手不僅能理解人類的日常對話,還能通過情感分析提供個性化的回應(yīng);在醫(yī)療領(lǐng)域,AI輔助診斷系統(tǒng)的準(zhǔn)確率已達到專業(yè)醫(yī)師水平,極大地提高了早期疾病篩查的效率。
面對這場深刻的技術(shù)變革,理解其背后的邏輯與應(yīng)用場景變得至關(guān)重要。從技術(shù)角度看,機器學(xué)習(xí)算法的進步(如深度學(xué)習(xí)、強化學(xué)習(xí))為AI應(yīng)用提供了強大的計算基礎(chǔ);從應(yīng)用層面看,智能推薦系統(tǒng)正在重塑電商和內(nèi)容平臺的用戶體驗,而自動駕駛技術(shù)則有望徹底改變未來的交通方式。這些發(fā)展都彰顯出AI技術(shù)的巨大潛力。
通過深入探討核心原理與實踐案例,我們可以更清晰地把握技術(shù)趨勢。例如,分析計算機視覺在安防監(jiān)控中的實際應(yīng)用,或研究預(yù)測算法在金融風(fēng)控中的具體表現(xiàn),都能幫助我們理解不同場景下的技術(shù)適配性。這種理解不僅有助于發(fā)掘潛在商業(yè)價值,更能為未來的技術(shù)創(chuàng)新與產(chǎn)業(yè)突破奠定堅實基礎(chǔ)。隨著5G、邊緣計算等配套技術(shù)的發(fā)展,AI的應(yīng)用邊界還將持續(xù)擴展,帶來更多令人期待的可能性。
核心庫選擇
GPUtil專門用于獲取NVIDIA GPU信息:
platform模塊提供基本的系統(tǒng)識別功能:
GUI開發(fā)選項對比:
tkinter(Python標(biāo)準(zhǔn)庫):
PyQt5/PySide6(第三方庫):
psutil(Python System and Process Utilities)是一個跨平臺的系統(tǒng)監(jiān)控庫,可以獲取系統(tǒng)運行時的各種關(guān)鍵信息:
CPU相關(guān):
- 使用率(psutil.cpu_percent())
- 核心數(shù)量(psutil.cpu_count())
- 溫度監(jiān)控(部分平臺支持)
- 示例:監(jiān)控CPU負(fù)載并設(shè)置告警閾值
內(nèi)存管理:
- 物理內(nèi)存總量及使用情況(psutil.virtual_memory())
- 交換分區(qū)信息(psutil.swap_memory())
- 示例:實時顯示內(nèi)存使用曲線圖
磁盤信息:
- 分區(qū)信息(psutil.disk_partitions())
- 使用情況(psutil.disk_usage())
- IO統(tǒng)計(psutil.disk_io_counters())
- 示例:監(jiān)控磁盤剩余空間并預(yù)警
網(wǎng)絡(luò)監(jiān)控:
- 網(wǎng)絡(luò)接口信息(psutil.net_if_addrs())
- IO統(tǒng)計(psutil.net_io_counters())
- 連接信息(psutil.net_connections())
顯存使用情況
- GPU溫度監(jiān)控
- 負(fù)載百分比
- 示例:深度學(xué)習(xí)訓(xùn)練時的GPU監(jiān)控面板
- 操作系統(tǒng)類型(platform.system())
- 系統(tǒng)版本(platform.version())
- 處理器架構(gòu)(platform.machine())
示例:生成系統(tǒng)診斷報告
- 優(yōu)勢:無需額外安裝,適合簡單界面
- 缺點:界面較簡陋,功能有限
示例應(yīng)用:基礎(chǔ)系統(tǒng)監(jiān)控儀表盤
優(yōu)勢:
- 豐富的UI組件(表格、圖表等)
- 支持多線程
- 現(xiàn)代化界面設(shè)計
缺點:
- 需要單獨安裝
- 學(xué)習(xí)曲線較陡
示例應(yīng)用:
- 專業(yè)級系統(tǒng)監(jiān)控工具
- 帶歷史數(shù)據(jù)可視化的性能分析器
基本系統(tǒng)信息采集實現(xiàn)
import psutil
import platform
from datetime import datetime
def 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)
# 內(nèi)存信息
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
# 系統(tǒng)信息
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監(jiān)控功能
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 None
except ImportError:
def get_gpu_info():
return None
使用Tkinter構(gòu)建簡單GUI
import tkinter as tk
from tkinter import ttk
class HardwareMonitor(tk.Tk):
def __init__(self):
super().__init__()
self.title("硬件監(jiān)控工具")
self.geometry("600x400")
# 創(chuàng)建標(biāo)簽框架
self.cpu_frame = ttk.LabelFrame(self, text="CPU 信息")
self.mem_frame = ttk.LabelFrame(self, text="內(nèi)存 信息")
self.disk_frame = ttk.LabelFrame(self, text="磁盤 信息")
self.sys_frame = ttk.LabelFrame(self, text="系統(tǒng) 信息")
# 布局
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)
# 添加標(biāo)簽
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)
# 更新內(nèi)存信息
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)
# 更新系統(tǒng)信息
sys_text = f"系統(tǒng): {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']} | 負(fù)載: {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構(gòu)建更專業(yè)的界面
from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout,
QWidget, QLabel, QTabWidget, QProgressBar)
from PyQt5.QtCore import QTimer
import sys
class QtHardwareMonitor(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("硬件監(jiān)控工具")
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)
# 創(chuàng)建標(biāo)簽頁
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, "內(nèi)存")
self.tabs.addTab(self.disk_tab, "磁盤")
self.tabs.addTab(self.sys_tab, "系統(tǒng)")
# 初始化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'])
# 更新其他標(biāo)簽頁...
高級功能擴展
實時圖表顯示 使用matplotlib可以創(chuàng)建實時更新的硬件使用率圖表:
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class ChartMonitor(tk.Tk):
def __init__(self):
super().__init__()
self.title("硬件監(jiān)控圖表")
# 創(chuàng)建圖表
self.fig = Figure(figsize=(5, 4), dpi=100)
self.ax = self.fig.add_subplot(111)
# 初始化數(shù)據(jù)
self.x_data = list(range(60))
self.y_data = [0] * 60
# 創(chuàng)建畫布
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):
# 獲取當(dāng)前CPU使用率
cpu_percent = psutil.cpu_percent(interval=1)
# 更新數(shù)據(jù)
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)
網(wǎng)絡(luò)監(jiān)控功能 可以擴展網(wǎng)絡(luò)監(jiān)控功能:
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
}
打包為可執(zhí)行文件
使用PyInstaller可以將應(yīng)用打包為獨立可執(zhí)行文件:
pip install pyinstaller pyinstaller --onefile --windowed hardware_monitor.py
這些方法提供了從簡單到高級的硬件監(jiān)控實現(xiàn)方案,可以根據(jù)需求選擇合適的組件進行組合或擴展。具體來說:
基礎(chǔ)監(jiān)控方案
適用于入門級需求,主要包含:
- CPU/GPU溫度監(jiān)控(如使用
lm-sensors工具) - 內(nèi)存使用率統(tǒng)計(通過
free -m命令) - 磁盤空間檢查(
df -h命令) 應(yīng)用場景:個人開發(fā)者調(diào)試或小型服務(wù)器基礎(chǔ)運維
中級監(jiān)控方案
增加實時性和可視化能力:
# Prometheus配置片段
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['192.168.1.100:9100']
- 使用
Prometheus+Grafana搭建監(jiān)控儀表盤 - 集成網(wǎng)絡(luò)流量監(jiān)控(如
nload工具) - 添加SMART硬盤健康檢測 典型配置示例:
高級企業(yè)級方案
包含自動化預(yù)警和分布式監(jiān)控:
- 部署
Zabbix或Nagios監(jiān)控集群 - 實現(xiàn)SNMP協(xié)議設(shè)備管理
- 定制化開發(fā)監(jiān)控插件(如通過Python編寫硬件探針) 擴展建議:
- 對關(guān)鍵業(yè)務(wù)服務(wù)器配置雙通道監(jiān)控
- 建立分級告警機制(郵件/短信/企業(yè)微信通知)
特殊場景方案
- 工業(yè)環(huán)境:增加4-20mA信號采集模塊
- 邊緣計算:部署輕量級
Telegraf代理 - 高安全要求:采用硬件加密的監(jiān)控數(shù)據(jù)鏈路
方案選擇時需綜合考慮硬件規(guī)模(單機/集群)、監(jiān)控粒度(秒級/分鐘級)以及預(yù)算成本。建議從基礎(chǔ)方案開始,逐步按需擴展功能模塊。
以上就是基于Python開發(fā)電腦硬件監(jiān)控工具的詳細(xì)內(nèi)容,更多關(guān)于Python監(jiān)控的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python執(zhí)行錯誤“由于找不到python39.dll,無法繼續(xù)執(zhí)行代碼”解決的步驟
這篇文章主要介紹了在Python開發(fā)中遇到“找不到python39.dll”的錯誤,并提供了詳細(xì)的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
Python轉(zhuǎn)換itertools.chain對象為數(shù)組的方法
這篇文章主要介紹了Python轉(zhuǎn)換itertools.chain對象為數(shù)組的方法,通過代碼給大家介紹了itertools 的 chain() 方法,需要的朋友可以參考下2020-02-02
Numpy中如何創(chuàng)建矩陣并等間隔抽取數(shù)據(jù)
這篇文章主要介紹了Numpy中如何創(chuàng)建矩陣并等間隔抽取數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
關(guān)于Python使用turtle庫畫任意圖的問題
這篇文章主要介紹了Python turtle庫畫任意圖,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04

