Seite 1 von 1

sensors / lm-sensors parsen

Verfasst: Dienstag 29. Juni 2010, 17:26
von Dav1d
Ein kleines Skript zum parsen von "sensors" bzw. lm-sensors http://www.lm-sensors.org/

Ich habs mir geschrieben um in meiner "taskleiste" von dwm die temps vom PC anzeigen zu lassen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from subprocess import Popen, PIPE
from collections import defaultdict

SENSORS_CMD = 'sensors'
SENSORS_ARGS = ['-u']

def parse_sensors(sensors_cmd=SENSORS_CMD, sensors_args=None):
    '''opens a sensors process with subprocess and returns
    a dict with the parsed stdout.
    sensors_args must be None or a list, which contains the
    arguments for the sensors process.'''
    if sensors_args is None:
        sensors_args = SENSORS_ARGS
    elif not '-u' in sensors_args:
        sensors_args.append('-u')
    stdout, stderr = Popen([sensors_cmd] + sensors_args, stdout=PIPE,
                           universal_newlines=True).communicate()
    return parse_sensors_stdout(stdout)
                           

def parse_sensors_stdout(sensors_stdout):
    '''parses the stdout of a sensors process called with the
    -u argument'''
    parsed_stdout = [b.splitlines() for b in
                     sensors_stdout.strip().split('\n\n')]
    pd = defaultdict(lambda:defaultdict(dict))
    
    for block in parsed_stdout:
        key = block.pop(0)
        for line in block:
            if not ':' in line:
                pass
            elif line.endswith(':'):
                name = line[:-1]
            elif not line.startswith(' '):
                name, value = line.split(': ')
                pd[key][name] = value
            else:
                type_, value = line.strip().split(': ')
                pd[key][name][type_.partition('_')[2]] = value

    return dict([(k, dict(v)) for k, v in pd.iteritems()])

if __name__ == '__main__':
    from pprint import pprint
    pprint(parse_sensors())
Über Verbesserungsvorschläge würde ich mich freuen.

Re: sensors / lm-sensors parsen

Verfasst: Donnerstag 1. Juli 2010, 13:35
von mkesper
Der subprocess-Aufruf schmeißt Kommando und Argument zusammen, das sollten zwei Argumente sein. Außerdem empfiehlt die Doku zu subprocess, communicate() zu verwenden.

Re: sensors / lm-sensors parsen

Verfasst: Donnerstag 1. Juli 2010, 13:52
von lunar
@mkesper: Worauf beziehst Du Dich? Er verwendet doch communicate?!

@Dav1d: Noch besser(TM) wäre es natürlich, libsensors mit ctypes anzusprechen :)

Re: sensors / lm-sensors parsen

Verfasst: Donnerstag 1. Juli 2010, 14:19
von Dav1d
mkesper hat geschrieben:Der subprocess-Aufruf schmeißt Kommando und Argument zusammen, das sollten zwei Argumente sein. Außerdem empfiehlt die Doku zu subprocess, communicate() zu verwenden.
:?: Es sind 2 Argumente Liste + Liste = Liste :D und ich verwende communicate

Ctypes, irgendwann vllt :D

Re: sensors / lm-sensors parsen

Verfasst: Donnerstag 1. Juli 2010, 14:59
von BlackJack
Mit `ctypes` hatte ich das neulich mal angefangen, nur um dann festzustellen, dass die von libsensors 2.x zu 3.x die API geändert haben. Wenn ich auf allen Rechnern die neue API habe, mache ich da vielleicht mal weiter. :-)