Getting CPU temperature using Python?

Question:

How do I retrieve the temperature of my CPU using Python? (Assuming I’m on Linux)

Asked By: jamieb

||

Answers:

Py-cputemp seems to do the job.

Answered By: DrDee

Depending on your Linux distro, you may find a file under /proc that contains this information. For example, this page suggests /proc/acpi/thermal_zone/THM/temperature.

Answered By: Greg Hewgill

You could try the PyI2C module, it can read directly from the kernel.

Answered By: Wolph

If your Linux supports ACPI, reading pseudo-file /proc/acpi/thermal_zone/THM0/temperature (the path may differ, I know it’s /proc/acpi/thermal_zone/THRM/temperature in some systems) should do it. But I don’t think there’s a way that works in every Linux system in the world, so you’ll have to be more specific about exactly what Linux you have!-)

Answered By: Alex Martelli

As an alternative you can install the lm-sensors package, then install PySensors (a python binding for libsensors).

Answered By: yassi

There is a newer “sysfs thermal zone” API (see also LWN article and Linux kernel doc) showing temperatures under e.g.

/sys/class/thermal/thermal_zone0/temp

Readings are in thousandths of degrees Celcius (although in older kernels, it may have just been degrees C).

Answered By: Craig McQueen

Reading files in /sys/class/hwmon/hwmon*/temp1_* worked for me but AFAIK there are no standards for doing this cleanly.
Anyway, you can try this and make sure it provides the same number of CPUs shown by “sensors” cmdline utility, in which case you can assume it’s reliable.

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
Answered By: Giampaolo Rodolà

Sysmon works nice. Nicely made, it does much more than measure CPU temperature. It is a command line program, and logs all the data it measured to a file. Also, it is open-source and written in python 2.7.

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

Answered By: Calvin K

I recently implemented this in psutil for Linux only.

>>> 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)]}
Answered By: Giampaolo Rodolà

Look after pyspectator in pip

Requires python3

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

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

I would reflect on SDsolar‘s solving above, modified the code a bit., and now it shows not only one value. Until the while loop you gets continuously the actual value of the CPUs temperature

On linux systems:

Install the pyspectator module:

pip install pyspectator

Put this code into a file ‘cpu-temp.py’

#!/usr/bin/env python3
from pyspectator.processor import Cpu
from time import sleep

while True:
    cpu = Cpu(monitoring_latency=1) #changed here
    print (cpu.temperature)
    sleep(1)
Answered By: stefansson

For Linux systems(Tried on Ubuntu 18.04)

Install the acpi module by
sudo apt install acpi

Running acpi -V should give you a ton of info about your system. Now we just need to get the temperature value via python.

import os
os.system("acpi -V > output.txt")
battery = open("output.txt", "r")
info = battery.readline()
val = info.split()
percent4real = val[3]
percentage = int(percent4real[:-1])
print(percentage)

The percentage variable will give you the temperature.
So, first we take the output of the acpi -V command in a text file and then read it. We need to convert it into an integer since the data is all in String type.

  • Note: This command does not display CPU temperature when used in WSL
Answered By: Luce
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.