系统守护者:使用PyCharm与Python实现关键硬件状态的实时监控
目录
前言
系统准备
软件下载与安装
安装相关库
程序准备
主体程序
更改后的程序:
编写.NET程序
前言
在现代生活中,电脑作为核心工具,其性能和稳定性的维护至关重要。为确保电脑高效运行,我们不仅需关注软件优化,如定期清理、安装防护软件、更新补丁和合理管理硬盘空间,还需重视硬件保养,特别是散热、定期硬件检查与适时升级。这些综合措施,有助于延长电脑寿命,提升使用体验。
本篇聚焦于利用Python这一强大工具,实现对GPU和CPU等关键硬件运行状况的实时监控。通过Python脚本,我们能够自动监测温度、负载等指标,及时发现潜在问题。这种技术应用不仅简化了维护流程,还提高了问题响应速度,是现代电脑维护策略中的重要一环。接下来,我们将深入探讨如何使用Python实现这些监控功能,为电脑的持续健康运行提供有力支持。
通过本篇的探讨,我们将掌握如何利用Python监控硬件,为个人电脑的高效管理和维护开辟新途径,让电脑在信息处理与科研探索中发挥更大效能。
诚邀各位大佬指正,我将不胜感激。
系统准备
软件下载与安装
我用的软件是PyCharm Community Edition 2023.1,下载安装请参考:
https://m.runoob.com/python3/https://m.runoob.com/python3/
安装相关库
我的电脑系统是Windows10,要实现监控CPU和NVIDIA GPU的温度等情况,采用的是psutil库读取CPU的特定数据,GPU则使用nvidia-ml-py3库。
nvidia-ml-py3库是一个用于管理和监控NVIDIA GPU的python接口,封装了NVML功能。通过它可以利用python代码查询GPU的状态,如温度、内存使用情况、计算利用率等等。
psutil库提供了丰富的接口来获取系统和进程的信息,包括CPU、内存、磁盘、网络等信息。
在pycharm中打开终端输入以下指令来安装其上两个库:
pip install psutil
pip install nvidia-ml-py3
window系统中pycharm打开终端的方法:
一、view-->Tool Windows-->Terminal
二、alt+F12
三、pycharm的左边竖着的工具栏中有终端图标点击即可。
图一
输入完安装指令后,如果出现以下提示,可以采用指令进行解决:
[notice] A new release of pip is available: 23.2.1 -> 24.0
[notice] To update, run: python.exe -m pip install --upgrade pip
指令:
python.exe -m pip install --upgrade pip
程序准备
主体程序
import time
import psutil
import pynvmldef get_cpu_info():
cpu_percent = psutil.cpu_percent(interval=1)
memory_info = psutil.virtual_memory()
memory_used = memory_info.percent
return cpu_percent, memory_useddef get_gpu_info(pynml=None):try:pynvml.nvmlInit()device_count = pynvml.nvmlDeviceGetCount()gpu_data = []for i in range(decice_count):handle = pynvml.nvmlDeviceGetHandleByIndex(i)name = pynvml.nvmlDeviceGetName(handle)util = pynml.nvmlDeviceGetUtilizationRates(handle)gpu_util = util.gputemp = pynvml.nvmlDeviceGetTemperature(handle, pynvml.NVML_TEMPERATURE_GPU)mem_info = pynvml.nvmlDeviceGetMemoryInfo(handle)total_memory = mem_info.total / (1024 ** 2)used_memory = mem_info.used / (1024 ** 2)gpu_data.append({'name': name,'util': gpu_util,'temp': temp,'total_memory': total_memory,'used_memory': used_memory})pynvml.nvmlShutdown()return gpu_dataexcept pynvml.NVMLError as e:print("Error while fetching GPU data: ", e)return []def main():while True:cpu_percent, memory_used = get_cpu_info()print(f"CPU Usage: {cpu_percent}%")print(f"Memory Usage: {memory_used}%")gpu_data = get_gpu_info()if gpu_data:for gpu in gpu_data:print(f"GPU {gpu['name']}:")print(f" Utilization: {gpu['util']}%, Temperature: {gpu['temp']}°C")print(f" Memory: {gpu['used_memory']} MB / {gpu['total_memory']} MB")print("")print("-" * 40)time.sleep(5)if __name__ == "__main__":main()
解释:
添加了必要的库,其中的time让其能够更好的控制程序的更新频率,不至于太快给电脑太大的压力。
定义了三个函数,第一个是获取CPU的信息,第二个是获取GPU的信息,第三个是主函数。
在第一个函数中,我获取了CPU的使用率和内存的使用率,interval=1表示1秒的采样间隔,让我每隔一秒获取CPU的使用率。
在第二个函数中,因为获取GPU的相关信息比CPU要复杂一点,所以其函数也相应的复杂。先是初始化NVIDIA管理库,以便获取GPU信息,然后获取系统中的GPU的数量,其后初始化一个空列表以便储存GPU的相关信息。for是循环遍历每一个GPU,获取GPU的句柄,这是访问GPU的唯一标识,然后获取名称、使用率、温度、内存信息,我获取了GPU的总内存和已使用的内存,最终使用了gpu_data.append({})是以字典的形式来储存获取的GPU相关信息。
主函数,因为需要监控,所以利用while来循环。因为我们获取信息的动作已经完成,直接在其函数中书写打印显示我们想要的信息即可。
为了保证程序能够使用,进行了测试,结果对于GPU的采集发生了错误:
图二
这里的错误是指没有找到NVML的共享文件。
解决方法:
将nvml.dll文件添加到环境变量中。
先找到nvml.dll文件。
win+R打开命令提示符,输入cmd,最后输入
where nvidia-smi
找到了nvidia-smi.exe,nvml.dll文件与其在同一路径之下。
手动添加
进入设置中的关于-->点击高级系统设置-->在高级界面中点击环境变量-->找到系统变量区域下的path并选中,点击编辑-->在新的界面中点击新建-->添加路径,确认,重启电脑即可。
如果还未解决,怎采取以下方式:
下载CUDA Toolkit
要下载与自己的显卡驱动程序版本和系统架构相适应的CUDA Toolkit。
查看系统信息在任务栏中的搜索框中输入msinfo32,查看显卡的信息可在NVIDIA控制面板中点击帮助,点击系统信息即可查看。
我的系统可以支持12.6版本的,以下是下载地址:
https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local
下面的地址是查看自己的系统可以支持的版本:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions
安装完成之后,找到nvml.dll文件,更新环境变量。
由于我电脑比较差,没有多余空间安装CUDA,请各位大佬自行决定是否利用此方法观察是否有效,谢谢!
因此,我更换了库,pynvml库需要电脑中存在CUDA Toolkit才能运作,于是我更换了一个更加简单的库GUPtil。
更改后的程序:
import tkinter as tk # 导入tkinter库,用于创建GUI
import psutil # 导入psutil库,用于获取系统信息
import GPUtil # 导入GPUtil库,用于获取GPU信息
import subprocess # 导入subprocess库,用于执行系统命令# 定义.NET程序路径
NET_PROGRAM_PATH = "D:\\CPU\\setup.exe"def get_cpu_usage():# 使用psutil获取CPU的使用率,参数2表示计算使用率的时间间隔,这里为2秒return psutil.cpu_percent(interval=2)def get_cpu_name():# 尝试通过PowerShell命令获取CPU名称try:# 执行PowerShell命令并获取输出cpu_info = subprocess.check_output("powershell -command \"Get-CimInstance Win32_Processor | Select-Object -ExpandProperty Name\"",shell=True).decode().strip() # 将输出解码为字符串并去除空格return cpu_info if cpu_info else "未知CPU"except Exception as e:# 处理异常情况,打印错误信息并返回未知CPUprint(f"获取CPU名称时出错: {e}")return "未知CPU"def get_cpu_memory_usage():# 使用psutil获取CPU的内存使用情况memory = psutil.virtual_memory()return {'used_memory': f"{memory.used / (1024 ** 2):.1f} MB", # 已用内存,转换为MB'total_memory': f"{memory.total / (1024 ** 2):.1f} MB" # 总内存,转换为MB}def get_gpu_info():# 获取所有GPU的详细信息gpus = GPUtil.getGPUs()gpu_info = [] # 用于存储处理后的GPU信息for gpu in gpus:# 将GPU信息添加到字典中gpu_info.append({'id': gpu.id,'name': gpu.name,'load': f"{gpu.load * 100:.1f}%", # 载荷百分比'temp': f"{gpu.temperature} °C", # 温度'used_memory': f"{gpu.memoryUsed} MB", # 已用内存'total_memory': f"{gpu.memoryTotal} MB" # 总内存})return gpu_info # 返回处理后的GPU信息列表def update_info():# 获取CPU使用率、名称和内存使用情况cpu_usage = get_cpu_usage()cpu_name = get_cpu_name()cpu_memory = get_cpu_memory_usage()# 获取GPU信息gpu_data = get_gpu_info()# 初始化信息文本info_text = f"CPU名称: {cpu_name}\n"info_text += f"CPU使用率: {cpu_usage}%\n"info_text += f"CPU内存使用: {cpu_memory['used_memory']} / {cpu_memory['total_memory']}\n"# 构造GPU信息的显示文本for gpu in gpu_data:info_text += (f"GPU {gpu['id']} ({gpu['name']}):\n"f" 使用率: {gpu['load']}\n"f" 温度: {gpu['temp']}\n"f" 内存使用: {gpu['used_memory']} / {gpu['total_memory']}\n")# 更新GUI中的文本label.config(text=info_text)# 设置定时器,每3秒更新一次信息root.after(3000, update_info)# 启动 .NET 程序而不显示命令行窗口
subprocess.Popen(NET_PROGRAM_PATH, shell=False, creationflags=subprocess.CREATE_NO_WINDOW)# 创建主窗口
root = tk.Tk()
root.title("CPU和GPU信息") # 设置窗口标题# 创建标签组件,用于显示信息
label = tk.Label(root, text="", justify=tk.LEFT)
label.pack(padx=20, pady=20) # 设置填充# 调用update_info进行首次信息更新
update_info()# 进入消息循环
root.mainloop()
下载地址:
https://openhardwaremonitor.org/downloads/
编写.NET程序
可以利用VS2019来编写程序。
using System; // 引入系统命名空间,用于基本类型和控制台操作
using OpenHardwareMonitor.Hardware; // 引入硬件监控库命名空间class Program
{static void Main(string[] args) // 主函数,程序入口点{Computer computer = new Computer { CPUEnabled = true }; // 创建Computer对象,启用CPU监测computer.Open(); // 开启硬件监控try{while (true) // 无限循环,直到收到退出信号{foreach (var hardware in computer.Hardware) // 遍历所有硬件{hardware.Update(); // 更新硬件信息Console.WriteLine($"检测到 {hardware.HardwareType}: {hardware.Name}"); // 打印硬件类型和名称foreach (var sensor in hardware.Sensors) // 遍历硬件上的传感器{if (sensor.SensorType == SensorType.Temperature) // 检查传感器类型是否为温度{if (sensor.Value.HasValue) // 检查温度值是否存在{Console.WriteLine($"传感器名称: {sensor.Name}, 温度值: {sensor.Value.Value}°C"); // 打印传感器名称和温度值}else // 如果温度值不存在{Console.WriteLine($"传感器名称: {sensor.Name}, 温度值: 无法获取"); // 打印传感器名称和提示信息}}}}Thread.Sleep(3000); // 每3秒执行一次}}catch (Exception ex) // 捕获并处理异常{Console.WriteLine($"出现错误: {ex.Message}"); // 打印错误信息}finally{computer.Close(); // 关闭硬件监控}//Console.WriteLine("程序完成。按任意键退出。"); // 提示用户程序完成//Console.ReadKey(); // 等待用户按键}
}
代码运行的结果:
图三
完成代码编写之后,然后发布程序。
图四
发布的程序,只需要注意发布到哪个文件夹就行了,其他可以默认。在主体程序中,一定要注意你的.NET程序发布的名称,并且一定要注意用管理员身份才能获取温度信息,因此打开主体程序一定要用管理员身份运行。还有一点就是需要将OpenHardwareMonitor软件的文件与发布的程序放到同一个文件夹下面。
注意:使用了GUI界面,但是不要关闭命令提示符的界面,不然就关闭了代码运行,应当等待GUI界面出现后才可以关闭。
呈现结果:
图五
相关文章:

系统守护者:使用PyCharm与Python实现关键硬件状态的实时监控
目录 前言 系统准备 软件下载与安装 安装相关库 程序准备 主体程序 更改后的程序: 编写.NET程序 前言 在现代生活中,电脑作为核心工具,其性能和稳定性的维护至关重要。为确保电脑高效运行,我们不仅需关注软件优化…...

【工作流引擎集成】springboot+Vue+activiti+mysql带工作流集成系统,直接用于业务开发,流程设计,工作流审批,会签
前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…...

SumatraPDF一打开就无响应怎么办?
结论:当前安装版不论32位还是64位都会出现问题。使用portable免安装版未发现相关问题。——sumatrapdf可以用于pdf, epub, mobi 等格式文件的浏览。 点击看相关问题和讨论...

棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程
一、前言 【试用版软件下载,可以点击本文章最下方官网卡片】 棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程 棋牌计时计费软件的应用也提升了顾客的服务体验,顾客可以清晰的看到自己的消费时间和费用。增加了消费的透明…...

Excel下拉菜单制作及选项修改
Excel下拉菜单 1、下拉菜单制作2、下拉菜单修改 下拉框(选项菜单)是十分常见的功能。Excel支持下拉框制作,通过预设选项进行菜单选择,可以避免手动输入错误和重复工作,提升数据输入的准确性和效率 1、下拉菜单制作 步…...
树莓派 mysql (兼容mariadb)登陆问题
树莓派 mysql (兼容mariadb)登陆问题 树莓派 MySQL 登陆问题 1 使用默认账号登陆 在首次登陆的情况下,系统默认为root用户授权 sudo su root  2. 使用root用户登…...

智能手表(Smart Watch)项目
文章目录 前言一、智能手表(Smart Watch)简介二、系统组成三、软件框架四、IAP_F411 App4.1 MDK工程结构4.2 设计思路 五、Smart Watch App5.1 MDK工程结构5.2 片上外设5.3 板载驱动BSP5.4 硬件访问机制-HWDataAccess5.4.1 LVGL仿真和MDK工程的互相移植5…...

设计模式~~~
简单工厂模式(静态工厂模式) 工厂方法模式 抽象工厂角色 具体工厂角色...

Golang | Leetcode Golang题解之第458题可怜的小猪
题目: 题解: func poorPigs(buckets, minutesToDie, minutesToTest int) int {if buckets 1 {return 0}combinations : make([][]int, buckets1)for i : range combinations {combinations[i] make([]int, buckets1)}combinations[0][0] 1iterations…...
欢聚时代(BIGO)Android面试题及参考答案
网络 TCP 和 UDP 协议的区别是什么? TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种不同的传输层协议,它们有以下主要区别: 一、连接性 TCP 是面向连接的协议。在通信之前,需要通过三次握手建立连接,通信结束…...

[C语言]指针和数组
目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么? 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…...

Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9
最近折腾小主机,搭建项目环境,记录相关步骤 数据无价,丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录: cd /第一种方式备份命令: tar cvpzf backup.tgz / --exclude/proc --exclu…...
Linux的发展历史与环境
目录: 引言Linux的起源早期发展企业级应用移动与嵌入式系统现代计算环境中的Linux结论 引言 Linux,作为开源操作系统的代表,已经深刻影响了全球的计算环境。从其诞生之初到如今成为服务器、嵌入式系统、移动设备等多个领域的核心,…...
Jax(Random、Numpy)常用函数
目录 Jax vmap Array reshape Random PRNGKey uniform normal split choice Numpy expand_dims linspace jax.numpy.linalg[pkg] dot matmul arange interp tile reshape Jax jit jax.jit(fun, in_shardingsUnspecifiedValue, out_shardingsUnspecifiedVa…...

python-pptx 中 placeholder 和 shape 有什么区别?
在 python-pptx 库中,placeholder 和 shape 是两个核心概念。虽然它们看起来相似,但在功能和作用上存在显著的区别。为了更好地理解这两个概念,我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…...

王者农药更新版
一、启动文件配置 二、GPIO使用 2.1基本步骤 1.配置GPIO,所以RCC开启APB2时钟 2.GPIO初始化(结构体) 3.给GPIO引脚设置高/低电平(WriteBit) 2.2Led循环点亮(GPIO输出) 1.RCC开启APB2时钟。…...

各省份消费差距(城乡差距)数据(2005-2022年)
消费差距,特别是城乡消费差距,是衡量一个国家或地区经济发展均衡性的重要指标。 2005年-2022年各省份消费差距(城乡差距)数据(大数据).zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/…...

[Linux] 进程创建、退出和等待
标题:[Linux] 进程创建、退出和等待 个人主页水墨不写bug (图片来源于AI) 目录 一、进程创建fork() 1) fork的返回值: 2)写时拷贝 编辑3)fork常规用法 4ÿ…...

微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化
微软推出了为每个人提供的“AI伴侣”Copilot,它不仅能够理解用户的需求,还能根据用户的日常习惯和偏好进行适应和进化。帮助处理各种任务和复杂的日常生活场景。 它能够根据用户的生活背景提供帮助和建议,保护用户的隐私和数据安全。Copilot…...

【QT】QT入门
个人主页~ QT入门 一、简述QT1、什么是QT2、QT的优势3、应用场景 二、QT的基本使用1、新建项目(1)选择项目模版(2)选择项目路径(3)选择构建系统(4)填写类信息设置界面(5&…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...