在Python中获取CPU温度
我需要一个用Python获取CPU温度的示例代码。
顺便说一下,我是在Windows 7系统上运行的。
7 个回答
你可以使用 pywin32 来访问Windows的原生API。假设你的主板驱动程序通过它的驱动注册了一个WMI数据提供者,那么你应该可以查询Windows API来获取CPU的温度。如果是这样的话,你可以下载 pywin32扩展 和在ars的回答中提到的 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。
首先,下载这两个链接中的文件:http://openhardwaremonitor.org/downloads/ 和 http://www.cputhermometer.com/。下载后,把里面的 OpenHardwareMonitorLib.dll 和 CPUThermometerLib.dll 文件解压出来,并放到一个文件夹里。
接下来,你可以使用 pythonnet 这个模块来调用这些 .dll 文件,从而获取这些程序提供的各种数据。cputhermometer 可以显示每个 CPU 核心的温度,而 openhardwaremonitor 则提供其他所有信息。这样你就不需要使用 WMI 了,因为 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()
)。
使用 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)