sensors / lm-sensors parsen

Code-Stücke können hier veröffentlicht werden.
Antworten
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Der subprocess-Aufruf schmeißt Kommando und Argument zusammen, das sollten zwei Argumente sein. Außerdem empfiehlt die Doku zu subprocess, communicate() zu verwenden.
lunar

@mkesper: Worauf beziehst Du Dich? Er verwendet doch communicate?!

@Dav1d: Noch besser(TM) wäre es natürlich, libsensors mit ctypes anzusprechen :)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
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. :-)
Antworten