Доступ к температуре процессора в питоне - PullRequest
15 голосов
/ 16 июля 2010

Мне нужен пример кода для доступа к температуре процессора в Python.

Я использую Windows 7, кстати.

Ответы [ 5 ]

6 голосов
/ 29 сентября 2015

Используйте модуль WMI + Откройте аппаратный монитор + его интерфейс 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)
4 голосов
/ 19 апреля 2018

Загрузите http://openhardwaremonitor.org/downloads/ и http://www.cputhermometer.com/ и извлеките OpenHardwareMonitorLib.dll и CPUThermometerLib.dll и поместите их в каталог.

Затем вы можете использовать модуль pythonnet для обращения к DLL-файлам и получить любую статистику, предлагаемую этими программами. cputhermometer предлагает температуру для каждого ядра процессора, 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() при необходимости).

3 голосов
/ 16 июля 2010

Вы можете использовать pywin32 для доступа к собственному API Windows.Я полагаю, что должна быть возможность запросить у Windows API температуру процессора, если производитель вашего драйвера системной платы регистрирует провайдера данных WMI через их драйвер.Предполагая, что это так, вы можете загрузить pywin32 и Python WMI-модуль , упомянутые в ответе ars, и затем выполнить следующие действия:

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

Глядя на ответ IronSython в ответе ars, кажется, есть и другой способ сделать это, используя другой объект WMI.Используя тот же API и подход, вы можете попытаться получить значение температуры с помощью

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

, которое, очевидно, должно возвращать значение температуры в десятых долях Кельвина, таким образом, чтобы получить градус в градусах Цельсия, я думаю, вы просто поделите это значение на10 и вычтите ~ 273.

2 голосов
/ 16 июля 2010

Проверьте библиотеку cputemp .

РЕДАКТИРОВАТЬ: в Windows вы можете преобразовать сценарий IronPython , который использует WMI с использованием библиотеки Python WMI .

0 голосов
/ 28 мая 2016

Код, предлагаемый eadmaster, может работать для более старых процессоров, для которых был запрограммирован OpenHardwareMonitor, но у меня есть процессор Skylake i7 6700K.OpenHardwareMonitor не дал никаких результатов для меня.Однако есть форк этой программы под названием CPU Thermometer , основанный на OpenHardwareMonitor, который распознает моего процессора.

В погоне за тем, как получить температуру процессорачерез Python я переключился на IronPython, чтобы иметь доступ к .Net framework и иметь легкий доступ к другим данным о производительности, но должно быть довольно легко выяснить, как ретро приспособить его для ванильного Python 2.7 (просто запустите CPU ThermometerofOpenHardwareMonitor и измените ваше пространство имен на «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», поэтому мне пришлось сделать некоторое причудливое форматирование строки, чтобы получить правильный порядок, так как запрос возвращает ядра в обратном порядке.Это немного сбивало меня с толку, пока я не придумал способ обойти это.

...