it-swarm.com.de

CPU-Temperatur mit Python ermitteln?

Wie rufe ich die Temperatur meiner CPU mit Python ab? (Angenommen, ich bin auf Linux)

26
jamieb

Py-cputemp scheint die Arbeit zu erledigen.

8
DrDee

Es gibt eine neuere "sysfs thermal zone" API (siehe auch LWN article und Linux Kernel doc ), die Temperaturen unter z.

/sys/class/thermal/thermal_zone0/temp

Ablesungen sind in Tausendstel Grad Celsius (obwohl es in älteren Kerneln gerade Grad C gewesen sein kann).

14
Craig McQueen

Wenn Ihr Linux ACPI unterstützt, sollte das Lesen der Pseudo-Datei /proc/acpi/thermal_zone/THM0/temperature (der Pfad kann sich unterscheiden, ich weiß, dass es in einigen Systemen /proc/acpi/thermal_zone/THRM/temperature ist) dies tun. Aber ich glaube nicht, dass es eine Möglichkeit gibt, die in every Linux-Systemen auf der Welt funktioniert, also müssen Sie genauer sein, was genau Sie unter Linux haben!

8
Alex Martelli

Das Lesen von Dateien in/sys/class/hwmon/hwmon */temp1_ * hat für mich funktioniert, aber AFAIK gibt es keine Standards, um dies sauber zu machen. [ Die gleiche Anzahl von CPUs wird durch das Dienstprogramm " sensors " cmdline angezeigt. In diesem Fall können Sie davon ausgehen, dass es zuverlässig ist.

from __future__ import division
import os
from collections import namedtuple


_nt_cpu_temp = namedtuple('cputemp', 'name temp max critical')

def get_cpu_temp(Fahrenheit=False):
    """Return temperatures expressed in Celsius for each physical CPU
    installed on the system as a list of namedtuples as in:

    >>> get_cpu_temp()
    [cputemp(name='atk0110', temp=32.0, max=60.0, critical=95.0)]
    """
    # http://www.mjmwired.net/kernel/Documentation/hwmon/sysfs-interface
    cat = lambda file: open(file, 'r').read().strip()
    base = '/sys/class/hwmon/'
    ls = sorted(os.listdir(base))
    assert ls, "%r is empty" % base
    ret = []
    for hwmon in ls:
        hwmon = os.path.join(base, hwmon)
        label = cat(os.path.join(hwmon, 'temp1_label'))
        assert 'cpu temp' in label.lower(), label
        name = cat(os.path.join(hwmon, 'name'))
        temp = int(cat(os.path.join(hwmon, 'temp1_input'))) / 1000
        max_ = int(cat(os.path.join(hwmon, 'temp1_max'))) / 1000
        crit = int(cat(os.path.join(hwmon, 'temp1_crit'))) / 1000
        digits = (temp, max_, crit)
        if Fahrenheit:
            digits = [(x * 1.8) + 32 for x in digits]
        ret.append(_nt_cpu_temp(name, *digits))
    return ret
6

Ich habe dies kürzlich in psutil nur für Linux implementiert. 

>>> import psutil
>>> psutil.sensors_temperatures()
{'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],
 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],
 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),
              shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0),
              shwtemp(label='Core 1', current=52.0, high=100.0, critical=100.0),
              shwtemp(label='Core 2', current=45.0, high=100.0, critical=100.0),
              shwtemp(label='Core 3', current=47.0, high=100.0, critical=100.0)]}
4

Achten Sie auf pyspectator in pip

Benötigt Python3

from pyspectator import Cpu
from time import sleep
cpu = Cpu(monitoring_latency=1)

while True:
    print (cpu.temperature)
    sleep(1)
3
Pedro

Abhängig von Ihrer Linux-Distribution finden Sie unter /proc eine Datei, die diese Informationen enthält. Zum Beispiel diese Seite schlägt /proc/acpi/thermal_zone/THM/temperature vor.

2
Greg Hewgill

Alternativ können Sie das Paket lm-sensors installieren und anschließend PySensors (eine Python-Bindung für libsensors) installieren.

1
yassi

Du könntest das PyI2C Modul ausprobieren, es kann direkt aus dem Kernel lesen.

0
Wolph

Sysmon funktioniert Nizza. Schön gemacht, misst es viel mehr als nur die CPU-Temperatur. Es ist ein Befehlszeilenprogramm und protokolliert alle gemessenen Daten in einer Datei. Außerdem ist es Open Source und in Python 2.7 geschrieben. 

Sysmon: https://github.com/calthecoder/sysmon-1.0.1

0
calthecoder