it-swarm-eu.dev

Ottenere la temperatura della CPU usando Python?

Come posso recuperare la temperatura della mia CPU usando Python? (Supponendo che io sia su Linux)

26
jamieb

Py-cputemp sembra fare il lavoro.

8
DrDee

C'è una più recente API "sysfs thermal zone" (vedi anche LWN article e kernel Linux doc ) che mostra le temperature sotto ad es.

/sys/class/thermal/thermal_zone0/temp

Le letture sono in millesimi di gradi Celsius (sebbene nei kernel più vecchi, potrebbero essere stati appena gradi C).

14
Craig McQueen

Se il tuo Linux supporta ACPI, leggendo lo pseudo-file /proc/acpi/thermal_zone/THM0/temperature (il percorso potrebbe essere diverso, so che /proc/acpi/thermal_zone/THRM/temperature in alcuni sistemi) dovrebbe farlo. Ma non penso che ci sia un modo che funziona in ogni sistema Linux nel mondo, quindi dovrai essere più specifico su esattamente quale Linux hai! -)

8
Alex Martelli

Leggendo i file in/sys/class/hwmon/hwmon */temp1_ * ha funzionato per me ma AFAIK non ci sono standard per farlo in modo pulito. In ogni caso, puoi provare questo e assicurarti che fornisca lo stesso numero di CPU mostrato dall'utility cmdline " sensors ", nel qual caso si può assumere che sia affidabile.

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

Recentemente ho implementato questo in psutil solo per Linux. 

>>> 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

Prenditi cura di pyspectator in pip

Richiede python3

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

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

A seconda della tua distribuzione Linux, potresti trovare un file sotto /proc che contiene queste informazioni. Ad esempio, questa pagina suggerisce /proc/acpi/thermal_zone/THM/temperature.

2
Greg Hewgill

In alternativa è possibile installare il pacchetto lm-sensors, quindi installare PySensors (un binding python per libsensors).

1
yassi

Potresti provare il PyI2C module, può leggere direttamente dal kernel.

0
Wolph

Sysmon funziona bene. Ben fatto, fa molto più che misurare la temperatura della CPU. È un programma a riga di comando e registra tutti i dati misurati in un file. Inoltre, è open-source e scritto in python 2.7. 

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

0
calthecoder