在python中访问CPU温度

在python中访问CPU温度,python,windows,cpu,temperature,Python,Windows,Cpu,Temperature,我需要一个在python中访问CPU温度的示例代码 顺便说一句,我正在运行windows 7。查看库 编辑:在windows上,您可以使用python转换此文件,该文件使用WMI。您可以使用此文件访问本机windows API。我认为,如果主板驱动程序的制造商通过其驱动程序注册WMI数据提供程序,则应该可以查询Windows API的CPU温度。假设是这种情况,您可以下载ars在回答中提到的和,然后按照以下步骤进行: import wmi w = wmi.WMI() print w.Win32_

我需要一个在python中访问CPU温度的示例代码

顺便说一句,我正在运行windows 7。

查看库

编辑:在windows上,您可以使用python转换此文件,该文件使用WMI。

您可以使用此文件访问本机windows API。我认为,如果主板驱动程序的制造商通过其驱动程序注册WMI数据提供程序,则应该可以查询Windows API的CPU温度。假设是这种情况,您可以下载ars在回答中提到的和,然后按照以下步骤进行:

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即可。

使用+

示例代码:

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)

eadmaster提供的代码可能适用于OpenHardwareMonitor编程使用的旧CPU,但我有一个Skylake i7 6700K CPU。OpenHardwareMonitor没有为我提供任何结果。然而,这个程序的一个分支叫做,它基于OpenHardwareMonitor,它可以识别我的CPU

在研究如何通过Python获得CPU温度时,我切换到IronPython,以便访问.Net framework并轻松访问其他性能数据,但要想找到如何将其重新安装到普通Python 2.7中应该相当容易(只需运行CPU温度计而不是PenhardwareMonitor,并将名称空间更改为“root\cputhermeter”?有那么简单吗?)

样本输出:

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,并且不喜欢“ORDERBY”子句,因此我必须进行一些奇特的字符串格式设置,以便在查询以相反顺序返回核心时获得正确的顺序。这让我有点困惑,直到我想出了解决这个问题的办法

下载并解压缩OpenHardwareMonitorLib.dll和CPutherMeterlib.dll,并将它们放在一个目录中

然后,您可以使用pythonnet模块来寻址.dll并提取这些程序提供的任何stat。CPuthermeter提供每个核心的CPU温度,openhardwaremonitor提供其他一切。不需要使用要求程序在后台处于活动状态的WMI

我已经编写了一个小脚本(Python3.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
有关进一步的文档(不过,您应该能够从上述代码推断出所需的一切),请参阅(或网站上的cputhermeter)源代码,在python中使用这些函数和方法时,它们是相同的

我还没有在任何其他计算机上测试过这一点,因此不同的处理器体系结构可能不会完全相同


确保在运行测量(和代码< >子硬件[x]。UpDeDeUTE)(/CUT>)之间运行<代码>硬件[x]。UpDebug()/<代码>。< /P> < P>我从第三方接收到C++项目,并发现如何使用C++获得CPU和板临时。然后我发现我曾经用它帮助我模仿Python中的C++函数,其中很多代码是直接从那个库复制的。AdvLmDev'特定于我使用的电脑,应替换为'\\.\PhysicalDrive0'。还有一个获取其他CPU功耗测量值的函数。我这样做是因为我不想使用开放硬件监视器。您可能必须以管理员身份运行代码才能使其正常工作

import ctypes
import ctypes.wintypes as wintypes
from ctypes import windll


LPDWORD = ctypes.POINTER(wintypes.DWORD)
LPOVERLAPPED = wintypes.LPVOID
LPSECURITY_ATTRIBUTES = wintypes.LPVOID

GENERIC_READ = 0x80000000
GENERIC_WRITE = 0x40000000
GENERIC_EXECUTE = 0x20000000
GENERIC_ALL = 0x10000000

FILE_SHARE_WRITE=0x00000004
ZERO=0x00000000

CREATE_NEW = 1
CREATE_ALWAYS = 2
OPEN_EXISTING = 3
OPEN_ALWAYS = 4
TRUNCATE_EXISTING = 5

FILE_ATTRIBUTE_NORMAL = 0x00000080

INVALID_HANDLE_VALUE = -1
FILE_DEVICE_UNKNOWN=0x00000022
METHOD_BUFFERED=0
FUNC=0x900
FILE_WRITE_ACCESS=0x002

NULL = 0
FALSE = wintypes.BOOL(0)
TRUE = wintypes.BOOL(1)


def CTL_CODE(DeviceType, Function, Method, Access): return (DeviceType << 16) | (Access << 14) | (Function <<2) | Method




def _CreateFile(filename, access, mode, creation, flags):
    """See: CreateFile function http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).asp """
    CreateFile_Fn = windll.kernel32.CreateFileW
    CreateFile_Fn.argtypes = [
            wintypes.LPWSTR,                    # _In_          LPCTSTR lpFileName
            wintypes.DWORD,                     # _In_          DWORD dwDesiredAccess
            wintypes.DWORD,                     # _In_          DWORD dwShareMode
            LPSECURITY_ATTRIBUTES,              # _In_opt_      LPSECURITY_ATTRIBUTES lpSecurityAttributes
            wintypes.DWORD,                     # _In_          DWORD dwCreationDisposition
            wintypes.DWORD,                     # _In_          DWORD dwFlagsAndAttributes
            wintypes.HANDLE]                    # _In_opt_      HANDLE hTemplateFile
    CreateFile_Fn.restype = wintypes.HANDLE

    return wintypes.HANDLE(CreateFile_Fn(filename,
                         access,
                         mode,
                         NULL,
                         creation,
                         flags,
                         NULL))


handle=_CreateFile('\\\\.\\AdvLmDev',GENERIC_WRITE,FILE_SHARE_WRITE,OPEN_EXISTING,ZERO)

def _DeviceIoControl(devhandle, ioctl, inbuf, inbufsiz, outbuf, outbufsiz):
    """See: DeviceIoControl function
http://msdn.microsoft.com/en-us/library/aa363216(v=vs.85).aspx
"""
    DeviceIoControl_Fn = windll.kernel32.DeviceIoControl
    DeviceIoControl_Fn.argtypes = [
            wintypes.HANDLE,                    # _In_          HANDLE hDevice
            wintypes.DWORD,                     # _In_          DWORD dwIoControlCode
            wintypes.LPVOID,                    # _In_opt_      LPVOID lpInBuffer
            wintypes.DWORD,                     # _In_          DWORD nInBufferSize
            wintypes.LPVOID,                    # _Out_opt_     LPVOID lpOutBuffer
            wintypes.DWORD,                     # _In_          DWORD nOutBufferSize
            LPDWORD,                            # _Out_opt_     LPDWORD lpBytesReturned
            LPOVERLAPPED]                       # _Inout_opt_   LPOVERLAPPED lpOverlapped
    DeviceIoControl_Fn.restype = wintypes.BOOL

    # allocate a DWORD, and take its reference
    dwBytesReturned = wintypes.DWORD(0)
    lpBytesReturned = ctypes.byref(dwBytesReturned)

    status = DeviceIoControl_Fn(devhandle,
                  ioctl,
                  inbuf,
                  inbufsiz,
                  outbuf,
                  outbufsiz,
                  lpBytesReturned,
                  NULL)

    return status, dwBytesReturned

class OUTPUT_temp(ctypes.Structure):
        """See: http://msdn.microsoft.com/en-us/library/aa363972(v=vs.85).aspx"""
        _fields_ = [
                ('Board Temp', wintypes.DWORD),
                ('CPU Temp', wintypes.DWORD),
                ('Board Temp2', wintypes.DWORD),
                ('temp4', wintypes.DWORD),
                ('temp5', wintypes.DWORD)
                ]

class OUTPUT_volt(ctypes.Structure):
        """See: http://msdn.microsoft.com/en-us/library/aa363972(v=vs.85).aspx"""
        _fields_ = [
                ('VCore', wintypes.DWORD),
                ('V(in2)', wintypes.DWORD),
                ('3.3V', wintypes.DWORD),
                ('5.0V', wintypes.DWORD),
                ('temp5', wintypes.DWORD)
                ]

def get_temperature():
    FUNC=0x900
    outDict={}

    ioclt=CTL_CODE(FILE_DEVICE_UNKNOWN, FUNC, METHOD_BUFFERED, FILE_WRITE_ACCESS)

    handle=_CreateFile('\\\\.\\AdvLmDev',GENERIC_WRITE,FILE_SHARE_WRITE,OPEN_EXISTING,ZERO)

    win_list = OUTPUT_temp()
    p_win_list = ctypes.pointer(win_list)
    SIZE=ctypes.sizeof(OUTPUT_temp)


    status, output = _DeviceIoControl(handle, ioclt , NULL, ZERO, p_win_list, SIZE)


    for field, typ in win_list._fields_:
                #print ('%s=%d' % (field, getattr(disk_geometry, field)))
                outDict[field]=getattr(win_list,field)
    return outDict

def get_voltages():
    FUNC=0x901
    outDict={}

    ioclt=CTL_CODE(FILE_DEVICE_UNKNOWN, FUNC, METHOD_BUFFERED, FILE_WRITE_ACCESS)

    handle=_CreateFile('\\\\.\\AdvLmDev',GENERIC_WRITE,FILE_SHARE_WRITE,OPEN_EXISTING,ZERO)

    win_list = OUTPUT_volt()
    p_win_list = ctypes.pointer(win_list)
    SIZE=ctypes.sizeof(OUTPUT_volt)


    status, output = _DeviceIoControl(handle, ioclt , NULL, ZERO, p_win_list, SIZE)


    for field, typ in win_list._fields_:
                #print ('%s=%d' % (field, getattr(disk_geometry, field)))
                outDict[field]=getattr(win_list,field)
    return outDict
导入ctypes
将ctypes.wintypes导入为wintypes
从ctypes导入Windell
LPDWORD=ctypes.POINTER(wintypes.DWORD)
LPOVERLAPPED=wintypes.LPVOID
LPSECURITY\u ATTRIBUTES=wintypes.LPVOID
一般读取=0x8000000
一般写入=0x40000000
通用_EXECUTE=0x20000000
通用_ALL=0x10000000
文件共享写入=0x00000004
零=0x00000000
创建_NEW=1
创建\u始终=2
打开\u现有=3
打开\u始终=4
截断现有值=5
文件\属性\正常值=0x00000080
无效的\u句柄\u值=-1
文件\u设备\u未知=0x00000022
方法_缓冲=0
FUNC=0x900
文件写入访问=0x002
NULL=0
FALSE=wintypes.BOOL(0)
TRUE=wintypes.BOOL(1)

def CTL_代码(设备类型、函数、方法、访问):返回(设备类型我使用了来自

安装pythonnet时,基本上需要:

pip install pythonnet
然后以管理员身份执行终端,最后执行文件:

python pytherm.py
如果您作为普通用户运行它,但不会输出那么多数据,那么它也可以工作


由于它以JSON格式返回数据,因此您应该可以轻松获取所需特定硬件的数据。

似乎不支持Windows操作系统。它告诉我我的硬件不受支持:/python可能不是适合您需要的好语言选择。我在第一个代码中遇到以下错误:Traceback(最后一次调用):文件“”,第244行,在run_nodebug文件“”,第3行,在indexer中。错误:列表索引超出范围我收到一系列错误(OLE/COM)尝试这两种方法时。知道原因吗?我缺少什么?如何导入OpenHardwareMonitor或CPutherMeter?我按照所有说明操作,它只是告诉我它们都不存在“OpenHardwareMonitorLib.dll和CPutherMeterlib.dll,并将它们放在一个目录中”然后,您需要使用clr.AddReference(dll)导入这些dll。这将允许您导入OHM命名空间。如果它不起作用,则dll或您的系统会出现问题,阻止加载dll。似乎是“cputhermeterlib.dll”现在使用OpenHardwareMonitor命名空间。使用JetBrains dotPeek打开两个dll文件并对它们进行比较。快速浏览后,它们看起来很相似。结果是“从CPutherMeter导入硬件”将不再存在
python pytherm.py