使用Python调用LibreHardwareMonitor在WIN10下进行硬件信息读取(CPU/GPU温度)
我已经无处不在
编辑于 2024年05月25日 15:56
收录于文集
共3篇

        前车之鉴,上次兴高采烈的写完了调用OpenHardwareMonitorLib.dll的程序​,结果发现CPU比较高端,根本读不出温度信息。其他的信息倒是能读出来一些。写之前完全没有思考过由于版本更迭而出现错误的情况,引以为戒。

        经过多方查证,发现OpenHardwareMonitor有一个分支LibreHardwareMonitor,项目在GitHub上是开源的(https://github.com/LibreHardwareMonitor/LibreHardwareMonitor),并且一直有人在更新维护。

        由于我实在是过于小白,甚至不知道该如何使用这个项目(大哭)。最后借鉴了CSDN上的一篇文章(https://blog.csdn.net/nbt_silent1/article/details/130555272),解惑了调用和参数的问题,感谢。

        本程序由ChatGPT-4o全程参与辅助编写。

        本程序调用的LibreHardwareMonitorLib.dll是从由GitHub上下载的LibreHardwareMonitor软件内提取的:

LibreHardwareMonitor程序文件

        源码如下:

代码块
text/x-python
自动换行
复制代码
import clr  # 导入扩展模块
import os  # 导入操作系统模块

# 获取当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建LibreHardwareMonitorLib.dll的完整路径
dll_path = os.path.join(script_dir, 'LibreHardwareMonitorLib.dll')

# 将LibreHardwareMonitorLib.dll添加到CLR的引用中
clr.AddReference(dll_path)

# 从LibreHardwareMonitor模块中导入Hardware类
from LibreHardwareMonitor import Hardware

# 创建一个Hardware.Computer的实例对象
computer_tmp = Hardware.Computer()

computer_tmp.IsCpuEnabled = True  # 获取CPU
computer_tmp.IsGpuEnabled = True  # 获取GPU
# computer_tmp.IsMemoryEnabled = True  # 获取内存
# computer_tmp.IsNetworkEnabled = True  # 获取网卡数据
# computer_tmp.IsMotherboardEnabled = True  # 获取主板
# computer_tmp.IsControllerEnabled = True  #控制器,不知道是啥
# computer_tmp.IsStorageEnabled = True  # 获取硬盘

# 打开硬件监视器
computer_tmp.Open()

# 设置要获取的CPU和GPU温度数量
num_cpu_temps = 5  # 例如设置为4
num_gpu_temps = 1  # 例如设置为1

# 声明空数组,用于存储温度数据
cpu_temperatures = []
gpu_temperatures = []

# 遍历所有硬件对象
for hardware in computer_tmp.Hardware:
    # 将硬件类型转换为字符串
    hardware_type = str(hardware.HardwareType)

    # 如果硬件类型包含CPU并且CPU温度数据未达到预设数量
    if 'CPU' in hardware_type.upper() and len(cpu_temperatures) < num_cpu_temps:
        # 更新硬件数据
        hardware.Update()

        # 遍历硬件的传感器
        for sensor in hardware.Sensors:
            # 如果传感器类型是温度
            if sensor.SensorType == Hardware.SensorType.Temperature:
                # 输出本次获取到的CPU温度
                # print(sensor.Name, "温度:", sensor.Value)
                # 将CPU温度值添加到数组中
                cpu_temperatures.append(sensor.Value)
                # 如果已达到预设的CPU温度数量,停止获取更多数据
                if len(cpu_temperatures) == num_cpu_temps:
                    break

    # 如果硬件类型包含GPU并且GPU温度数据未达到预设数量
    elif 'GPU' in hardware_type.upper() and len(gpu_temperatures) < num_gpu_temps:
        # 更新硬件数据
        hardware.Update()

        # 遍历硬件的传感器
        for sensor in hardware.Sensors:
            # 如果传感器类型是温度
            if sensor.SensorType == Hardware.SensorType.Temperature:
                # 输出本次获取到的GPU温度
                # print(sensor.Name, "温度:", sensor.Value)
                # 将GPU温度值添加到数组中
                gpu_temperatures.append(sensor.Value)
                # 如果已达到预设的GPU温度数量,停止获取更多数据
                if len(gpu_temperatures) == num_gpu_temps:
                    break
		break
                
if cpu_temperatures:
    max_cpu_temp = max(cpu_temperatures)
    print("CPU最高温度:", max_cpu_temp)
else:
    print("未获取到CPU温度信息")

if gpu_temperatures:
    max_gpu_temp = max(gpu_temperatures)
    print("GPU最高温度:", max_gpu_temp)
else:
    print("未获取到GPU温度信息")
复制成功

        每一行都让ChatGPT加上了注释,再也不用自己动手写注释了。

        应将LibreHardwareMonitorLib.dll文件放于程序文件同目录。

        前面的语句不做介绍。【需要获取的CPU和GPU温度数量】的两个需要设置的变量是个笨办法,因为现在获取到的CPU温度数据是这样的:

LibreHardwareMonitor软件截图

        这个办公电脑的CPU是4核的,我只需要前面4个温度,最多再加上第五个的封装温度,其余温度不知道是干啥的,不做采集。不方便给名称做字符匹配,干脆就使用数量匹配了。

        后面的程序注释写的非常明白,不再叙述。

        上述程序运行结果:

上述程序运行结果

                记录自己的成长。