当前位置: 首页 > news >正文

系统守护者:使用PyCharm与Python实现关键硬件状态的实时监控

目录

前言

系统准备

软件下载与安装

安装相关库

程序准备

主体程序

更改后的程序:

编写.NET程序


前言

在现代生活中,电脑作为核心工具,其性能和稳定性的维护至关重要。为确保电脑高效运行,我们不仅需关注软件优化,如定期清理、安装防护软件、更新补丁和合理管理硬盘空间,还需重视硬件保养,特别是散热、定期硬件检查与适时升级。这些综合措施,有助于延长电脑寿命,提升使用体验。

本篇聚焦于利用Python这一强大工具,实现对GPU和CPU等关键硬件运行状况的实时监控。通过Python脚本,我们能够自动监测温度、负载等指标,及时发现潜在问题。这种技术应用不仅简化了维护流程,还提高了问题响应速度,是现代电脑维护策略中的重要一环。接下来,我们将深入探讨如何使用Python实现这些监控功能,为电脑的持续健康运行提供有力支持。

通过本篇的探讨,我们将掌握如何利用Python监控硬件,为个人电脑的高效管理和维护开辟新途径,让电脑在信息处理与科研探索中发挥更大效能。

诚邀各位大佬指正,我将不胜感激。

系统准备

软件下载与安装

我用的软件是PyCharm Community Edition 2023.1,下载安装请参考:

https://m.runoob.com/python3/icon-default.png?t=O83Ahttps://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程序 前言 在现代生活中,电脑作为核心工具,其性能和稳定性的维护至关重要。为确保电脑高效运行,我们不仅需关注软件优化&#xf…...

【工作流引擎集成】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 ![切换到root 用户](https://img-blog.csdnimg.cn/20191019082911668.png) 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.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #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

最近折腾小主机&#xff0c;搭建项目环境&#xff0c;记录相关步骤 数据无价&#xff0c;丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录&#xff1a; cd /第一种方式备份命令&#xff1a; tar cvpzf backup.tgz / --exclude/proc --exclu…...

Linux的发展历史与环境

目录&#xff1a; 引言Linux的起源早期发展企业级应用移动与嵌入式系统现代计算环境中的Linux结论 引言 Linux&#xff0c;作为开源操作系统的代表&#xff0c;已经深刻影响了全球的计算环境。从其诞生之初到如今成为服务器、嵌入式系统、移动设备等多个领域的核心&#xff0c…...

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

王者农药更新版

一、启动文件配置 二、GPIO使用 2.1基本步骤 1.配置GPIO&#xff0c;所以RCC开启APB2时钟 2.GPIO初始化&#xff08;结构体&#xff09; 3.给GPIO引脚设置高/低电平&#xff08;WriteBit&#xff09; 2.2Led循环点亮&#xff08;GPIO输出&#xff09; 1.RCC开启APB2时钟。…...

各省份消费差距(城乡差距)数据(2005-2022年)

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

[Linux] 进程创建、退出和等待

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

微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化

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

【QT】QT入门

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

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 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&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

WebRTC调研

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