Existe-t-il un module python pour parsingr les sysfs de Linux?

Hey all, Linux a beaucoup de fonctionnalités dans procfs et sysfs , et des outils comme vmstat étendent cela, mais j’ai besoin de collecter des données à partir de ces systèmes et j’espérais tirer parti d’un utilitaire unifié Python au lieu de pirater ensemble un tas de scripts disparates.

Pour ce faire, je dois d’abord déterminer si Python possède ou non les éléments dont j’ai besoin pour parsingr / traiter correctement les différents points de collecte de données. Donc, l’essence de ma question:

Existe-t-il un module python qui gère / parsing déjà les objects sysfs ?

J’ai cherché une telle bête via Google, Usenet et divers forums, mais je n’ai encore rien trouvé d’intelligent ou de fonctionnel. Donc, avant d’en retirer un, je pensais que je vérifierais d’abord ici.

Essaye celui-là:

 from os import listdir from os.path import isdir, isfile, islink, join, realpath, normpath from keyword import iskeyword _norm = lambda name: name + ('_' if iskeyword(name) else '') def _denorm(name): if name.endswith('_') and iskeyword(name[:-1]): return name[:-1] else: return name def _norm_path(path): return normpath(realpath(path)) class SysFsObject(object): __slots__ = ['_path', '__dict__'] @staticmethod def __id_args__(path='/sys'): return _norm_path(path) def __init__(self, path='/sys'): self._path = _norm_path(path) if not self._path.startswith('/sys'): raise RuntimeError("Using this on non-sysfs files is dangerous!") self.__dict__.update(dict.fromkeys(_norm(i) for i in listdir(self._path))) def __repr__(self): return "" % self._path def __setattr__(self, name, val): if name.startswith('_'): return object.__setattr__(self, name, val) name = _denorm(name) p = realpath(join(self._path, name)) if isfile(p): file(p, 'w').write(str(val)) else: raise RuntimeError def __getatsortingbute__(self, name): if name.startswith('_'): return object.__getatsortingbute__(self, name) name = _denorm(name) p = realpath(join(self._path, name)) if isfile(p): data = open(p, 'r').read()[:-1] try: return int(data) except ValueError: return data elif isdir(p): return SysFsObject(p) 

Ce n’est pas du tout poli, mais IIRC fonctionne 🙂

De la réponse du filmeur, mais avec le casting int () supprimé:

 from os import listdir from os.path import isdir, isfile, islink, join, realpath, normpath from keyword import iskeyword _norm = lambda name: name + ('_' if iskeyword(name) else '') def _denorm(name): if name.endswith('_') and iskeyword(name[:-1]): return name[:-1] else: return name def _norm_path(path): return normpath(realpath(path)) class SysFsObject(object): __slots__ = ['_path', '__dict__'] @staticmethod def __id_args__(path='/sys'): return _norm_path(path) def __init__(self, path='/sys'): self._path = _norm_path(path) if not self._path.startswith('/sys'): raise RuntimeError("Using this on non-sysfs files is dangerous!") self.__dict__.update(dict.fromkeys(_norm(i) for i in listdir(self._path))) def __repr__(self): return "" % self._path def __setattr__(self, name, val): if name.startswith('_'): return object.__setattr__(self, name, val) name = _denorm(name) p = realpath(join(self._path, name)) if isfile(p): file(p, 'w').write(val) else: raise RuntimeError def __getatsortingbute__(self, name): if name.startswith('_'): return object.__getatsortingbute__(self, name) name = _denorm(name) p = realpath(join(self._path, name)) if isfile(p): return open(p, 'r').read()[:-1] elif isdir(p): return SysFsObject(p) 

Le fait de lancer arbitrairement sur int est inattendu et même dangereux. Par exemple, si vous utilisiez ce code sur l’un des fichiers cpulist présents dans sysfs, une chaîne telle que “0-7” serait toujours renvoyée sur les systèmes multiprocesseurs. Puis, un jour, quelqu’un utilise votre code sur un système à cœur unique et la lecture du même fichier sysfs contenant “0” renvoie un int.

En d’autres termes, toute fonction qui appelle ce code et s’attend à recevoir le type de données natif de sysfs (chaînes) doit explicitement être convertie en str ().

Pas vraiment sûr de savoir pourquoi vous avez besoin de quelque chose de spécifique, ce sont tous des fichiers texte pour la plupart, vous pouvez simplement jouer avec eux directement.
Il n’y a pas de modules python qui le font aussi loin que je sache.