Как узнать температуру ЦП в Python 3.8?

Библиотеки pyspectator и psutil не работают. psutil работает лишь на linux, а pyspectator просто отказывается работать. Есть еще какие-нибудь библиотеки?


Ответы (1 шт):

Автор решения: gil9red

Решение нашел в использовании:

Для получения полной информации нужно запускать скрипт с правами администратора.

Пример:

import os

# pip install pythonnet
import clr

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

def initialize_openhardwaremonitor():
    DIR = os.path.abspath(os.path.dirname(__file__))
    dll_file_name = DIR + R'\OpenHardwareMonitorLib.dll'
    clr.AddReference(dll_file_name)

    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 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 None:
        return

    # If SensorType is Temperature
    if sensor.SensorType == openhardwaremonitor_sensortypes.index('Temperature'):
        type_name = openhardwaremonitor_hwtypes[sensor.Hardware.HardwareType]
        print(f"    {type_name}. {sensor.Hardware.Name!r} "
              f"Temperature Sensor #{sensor.Index} {sensor.Name} - {sensor.Value}°C")

if __name__ == "__main__":
    print("OpenHardwareMonitor:")
    HardwareHandle = initialize_openhardwaremonitor()
    fetch_stats(HardwareHandle)

Для дополнительной информации по работе с API OpenHardwareMonitorLib.dll обращайтесь к https://github.com/openhardwaremonitor/openhardwaremonitor/


PS.

Пока разбирался, нашел некоторые "подводные камни":

  • Код вида clr.AddReference('OpenHardwareMonitorLib.dll') не работает: нужно или убирать .dll из строки, или указывать абсолютный путь к dll
  • Не получится импортировать CPUThermometerLib.dll, т.к. пространство имен CPUThermometer из библиотеки не существует, даже больше -- у библиотек OpenHardwareMonitorLib.dll и CPUThermometerLib.dll с какой-то версии пространства одинаковые, что намекает на объединение кода или форк (пруф см. в скриншоте ниже). Поэтому из того ответа убрал использование CPUThermometerLib.dll, оставив OpenHardwareMonitorLib.dll
  • Библиотеку OpenHardwareMonitorLib.dll можно будет скачать с офф. сайта (скачать и вытащить из архива с программой) или сразу из папки примера

CPUThermometerLib.dll и OpenHardwareMonitorLib.dll одно и тоже:

Элемент списка

→ Ссылка