我需要一个示例代码来访问python中的CPU温度。
我正在运行Windows 7,BTW。
答案 0 :(得分:6)
使用WMI module + Open Hardware Monitor + its WMI interface described here。
示例代码:
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)
答案 1 :(得分:4)
下载http://openhardwaremonitor.org/downloads/和http://www.cputhermometer.com/并解压缩OpenHardwareMonitorLib.dll和CPUThermometerLib.dll并将其放在目录中。
然后,您可以使用pythonnet模块来解决.dlls并提取这些程序提供的任何统计信息。 cputhermometer提供每核心CPU临时值,openhardwaremonitor提供其他所有功能。无需使用需要程序在后台运行的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()
。
答案 2 :(得分:3)
您可以使用pywin32访问本机Windows API。我相信,如果主板驱动程序的制造商通过其驱动程序注册WMI数据提供程序,则应该可以查询Windows API的CPU温度。假设是这种情况,您可以下载ars中答案中提到的pywin32 extensions和Python WMI module,然后按以下步骤操作:
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。
答案 3 :(得分:2)
查看cputemp库。
编辑:在Windows上,您可以使用python IronPython script转换使用WMI的WMI library。
答案 4 :(得分:2)
我使用了https://github.com/BennyCarbajal/PyTherm上的实用程序
使用以下命令安装pythonnet
pip install pythonnet
然后只需以管理员身份执行终端,最后执行文件:
python pytherm.py
如果以普通用户身份运行它也可以,但是不会输出太多数据。
由于它以JSON格式返回数据,因此对于您而言,获取所要查找的特定硬件的数据应该很容易。
答案 5 :(得分:1)
我从第三方收到了一个C ++项目,并发现了如何使用C ++获得CPU和板卡温度。然后,我发现this曾经用来帮助我用ctypes模仿python中的C ++函数,很多代码直接从该存储库复制而来。 “ \\。\ AdvLmDev”特定于我使用的PC,应替换为“ \\。\ PhysicalDrive0”。还有一个功能可以获取其他CPU功率测量值。我这样做是因为我不想使用“打开硬件监视器”。您可能必须以管理员身份运行代码才能起作用。
show
答案 6 :(得分:0)
eadmaster提供的代码可能适用于OpenHardwareMonitor编程的旧CPU,但我有一个Skylake i7 6700K CPU。 OpenHardwareMonitor对我没有任何结果。但是,有一个名为CPU Thermometer的程序的分支,它基于OpenHardwareMonitor, 识别我的CPU。
在追逐如何通过Python获取CPU临时值时,我切换到IronPython以便访问.Net框架并轻松访问其他性能数据,但是应该很容易弄清楚如何适应它适用于vanilla Python 2.7(只需运行CPU温度计而不是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”子句的困难方式,所以我不得不做一些花哨的字符串格式化以使订单正确,因为查询返回内核订购。这让我感到困惑,直到我为此设计了这种方式。