在python中访问CPU温度

我需要一个用python访问CPU温度的例子代码。

顺便说一下,我运行的是Windows 7。

使用WMI模块+Open Hardware Monitor + 其WMI接口在此描述

示例代码。

import wmi
w = wmi.WMI(namespace="root\OpenHardwareMonitor")
temperature_infos = w.Sensor()
for sensor in temperature_infos:
    if sensor.SensorType==u'Temperature':
        print(sensor.Name)
        print(sensor.Value)
评论(0)

下载 http://openhardwaremonitor.org/downloads/http://www.cputhermometer.com/ 并提取 OpenHardwareMonitorLib.dll 和 CPUThermometerLib.dll 并把它们放在一个目录中。

然后,你可以使用pythonnet模块来寻址.dlls,并提取这些程序提供的任何统计数据。不需要使用WMI,这需要程序在后台活动。

我写了一个小脚本(python 3.6.5)来显示系统上可用的每一个温度传感器,当然你可以很容易地修改这个脚本,用于其他传感器类型。你必须以管理员身份运行这个脚本。

import clr #package pythonnet, not clr

openhardwaremonitor_hwtypes = ['Mainboard','SuperIO','CPU','RAM','GpuNvidia','GpuAti','TBalancer','Heatmaster','HDD']
cputhermometer_hwtypes = ['Mainboard','SuperIO','CPU','GpuNvidia','GpuAti','TBalancer','Heatmaster','HDD']
openhardwaremonitor_sensortypes = ['Voltage','Clock','Temperature','Load','Fan','Flow','Control','Level','Factor','Power','Data','SmallData']
cputhermometer_sensortypes = ['Voltage','Clock','Temperature','Load','Fan','Flow','Control','Level']

def initialize_openhardwaremonitor():
    file = 'OpenHardwareMonitorLib.dll'
    clr.AddReference(file)

    from OpenHardwareMonitor import Hardware

    handle = Hardware.Computer()
    handle.MainboardEnabled = True
    handle.CPUEnabled = True
    handle.RAMEnabled = True
    handle.GPUEnabled = True
    handle.HDDEnabled = True
    handle.Open()
    return handle

def initialize_cputhermometer():
    file = 'CPUThermometerLib.dll'
    clr.AddReference(file)

    from CPUThermometer import Hardware
    handle = Hardware.Computer()
    handle.CPUEnabled = True
    handle.Open()
    return handle

def fetch_stats(handle):
    for i in handle.Hardware:
        i.Update()
        for sensor in i.Sensors:
            parse_sensor(sensor)
        for j in i.SubHardware:
            j.Update()
            for subsensor in j.Sensors:
                parse_sensor(subsensor)

def parse_sensor(sensor):
        if sensor.Value is not None:
            if type(sensor).__module__ == 'CPUThermometer.Hardware':
                sensortypes = cputhermometer_sensortypes
                hardwaretypes = cputhermometer_hwtypes
            elif type(sensor).__module__ == 'OpenHardwareMonitor.Hardware':
                sensortypes = openhardwaremonitor_sensortypes
                hardwaretypes = openhardwaremonitor_hwtypes
            else:
                return

            if sensor.SensorType == sensortypes.index('Temperature'):
                print(u"%s %s Temperature Sensor #%i %s - %s\u00B0C" % (hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value))

if __name__ == "__main__":
    print("OpenHardwareMonitor:")
    HardwareHandle = initialize_openhardwaremonitor()
    fetch_stats(HardwareHandle)
    print("\nCPUMonitor:")
    CPUHandle = initialize_cputhermometer()
    fetch_stats(CPUHandle)

以下是我系统上的输出。

OpenHardwareMonitor:
SuperIO Nuvoton NCT6791D Temperature Sensor #0 CPU Core - 42.0°C
SuperIO Nuvoton NCT6791D Temperature Sensor #1 Temperature #1 - 35.0°C
SuperIO Nuvoton NCT6791D Temperature Sensor #2 Temperature #2 - 34.0°C
SuperIO Nuvoton NCT6791D Temperature Sensor #3 Temperature #3 - 25.0°C
SuperIO Nuvoton NCT6791D Temperature Sensor #4 Temperature #4 - 101.0°C
SuperIO Nuvoton NCT6791D Temperature Sensor #5 Temperature #5 - 16.0°C
SuperIO Nuvoton NCT6791D Temperature Sensor #6 Temperature #6 - 14.0°C
GpuNvidia NVIDIA GeForce GTX 1070 Temperature Sensor #0 GPU Core - 60.0°C
HDD ST31000528AS Temperature Sensor #0 Temperature - 37.0°C
HDD WDC WD20EARX-00PASB0 Temperature Sensor #0 Temperature - 36.0°C
HDD WDC WDS100T2B0B-00YS70 Temperature Sensor #0 Temperature - 40.0°C
HDD WDC WD80EFZX-68UW8N0 Temperature Sensor #0 Temperature - 31.0°C
HDD WDC WD30EFRX-68EUZN0 Temperature Sensor #0 Temperature - 30.0°C
HDD WDC WD80EFZX-68UW8N0 Temperature Sensor #0 Temperature - 33.0°C
HDD Crucial_CT256MX100SSD1 Temperature Sensor #0 Temperature - 40.0°C

CPUMonitor:
CPU Intel Core i7-8700K Temperature Sensor #0 CPU Core #1 - 39.0°C
CPU Intel Core i7-8700K Temperature Sensor #1 CPU Core #2 - 38.0°C
CPU Intel Core i7-8700K Temperature Sensor #2 CPU Core #3 - 37.0°C
CPU Intel Core i7-8700K Temperature Sensor #3 CPU Core #4 - 41.0°C
CPU Intel Core i7-8700K Temperature Sensor #4 CPU Core #5 - 36.0°C
CPU Intel Core i7-8700K Temperature Sensor #5 CPU Core #6 - 47.0°C

关于进一步的文档(不过你应该能够从上面的代码中推断出你所需要的一切),请参考https://github.com/openhardwaremonitor/openhardwaremonitor/(或cputhermometer,在网站上)的源代码,当你用python使用这些功能和方法时,是相同的。

我没有在其他电脑上测试过,所以不同的处理器架构可能功能不尽相同。

确保在测量之间运行Hardware[x].Update()(如果需要的话,还有SubHardware[x].Update())。

评论(4)

你可以使用pywin32来访问本地Windows API。我相信,如果你的主板驱动程序的制造商通过他们的驱动程序注册了一个WMI数据提供者,应该可以查询Windows API的CPU温度。假设是这样的话,你可以下载ars回答中提到的pywin32扩展Python WMI模块,然后按以下步骤操作。

import wmi
w = wmi.WMI()
print w.Win32_TemperatureProbe()[0].CurrentReading

看一下ars'答案中的IronPython脚本,似乎也有另一种方法,使用不同的WMI对象来实现。使用相同的API和方法,你可以尝试用以下方法接收温度值

w = wmi.WMI(namespace="root\wmi")
temperature_info = w.MSAcpi_ThermalZoneTemperature()[0]
print temperature_info.CurrentTemperature

显然,它应该返回以开尔文为单位的温度值,因此要接收摄氏度,我想你只需用这个值除以10,然后减去~273。

评论(2)

请查看cputemp库。

编辑:在WINDOWS上,你也许可以转换这个IronPython脚本,它使用pythonWMI库来使用WMI。

评论(4)

eadmaster提供的代码可能适用于OpenHardwareMonitor已编程的旧CPU,但我有一个Skylake i7 6700K CPU。OpenHardwareMonitor没有为我提供任何结果。然而,这个程序有一个分叉,叫做CPU温度计,它是基于OpenHardwareMonitor的,它*确实能识别我的CPU。

在追寻如何通过Python获得CPU温度的过程中,我换成了IronPython,以便能够访问.Net框架,并能方便地访问其他性能数据,但要想知道如何为vanilla Python 2.7改造它应该是相当容易的(只要运行CPU Thermometer而不是OpenHardwareMonitor,并将你的命名空间改为 "root\CPUThermometer"?有这么简单吗?)。)

#
# CPU Temp --REQUIRES CPU TEMPERATURE TO BE RUNNING!--
#
import clr
clr.AddReference('System.Management')
from System.Management import (ManagementScope, ManagementObject, ManagementObjectSearcher, WqlObjectQuery)

scope = ManagementScope("root\CPUThermometer")

searcher = ManagementObjectSearcher(scope, 
    WqlObjectQuery("SELECT * FROM Sensor Where SensorType LIKE 'Temperature'"), None)

mo = ManagementObject()

print "\n"
print "              Temp      Min       Max"

strout = str(' ')

for mo in searcher.Get():
    strout = '{0}   {1} C    {2} C    {3} C\n{4}'.format(mo["Name"], mo["Value"], mo["Min"], mo["Max"], strout)

print strout

输出样本。

D:\IronPython 2.7>ipy64 c:\users\neamerjell\desktop\test.py

              Temp      Min       Max
CPU Core #1   21.0 C    20.0 C    37.0 C
CPU Core #2   23.0 C    21.0 C    39.0 C
CPU Core #3   21.0 C    20.0 C    32.0 C
CPU Core #4   21.0 C    20.0 C    36.0 C

我发现这个查询不是标准的SQL,不喜欢 "Order By "子句,所以我不得不做一些花哨的字符串格式化来获得正确的顺序,因为这个查询以相反的顺序返回核心。这让我有点困惑,直到我想出了这个办法。

评论(0)