2011-01-10 11 views
6

全てねえ、Linuxはprocfssysfsに優れた機能をたくさん持っている、とvmstatのようなツールがあることかなり拡張するが、私はこれらの様々なシステムからデータを収集する必要があり、統一されたPythonのユーティリティを活用するために期待していました異種のスクリプトをまとめてハッキングするのではなく、Linuxのsysfsを解析するPythonモジュールはありますか?

まず、Pythonに異なるデータ収集ポイントを適切に解析/処理する必要があるかどうかを特定する必要があります。だから、私の質問の本質:

すでにオブジェクトを処理/解析するPythonモジュールはありますか?

私はGoogle、usenet、およびさまざまなフォーラムを通じてそのような獣を探しましたが、私はまだインテリジェントで機能的なものは見つかりませんでした。それで、私が1つを彫る前に、まず私がここでチェックすると思った。

+0

バンプ!!!この質問に基づいて[something](https://github.com/ponycloud/python-sysfs)があります –

答えて

1

なぜあなたは何か特定のものが必要なのかどうかはわかりませんが、それらはすべて大部分のテキストファイルです。それらを直接混乱させることができます。
私が知る限り、これを行うPythonモジュールはありません。

+2

duh?そのようなモジュールのポイントは、構造化された方法でファイルを読み込むことになります... sysfs.thermal_zone0.temp –

2

この方法を試してください。filmorの答えから

+0

これはどのように使用しますか?それは次のようなもの、例えばnumaノードを見つけ出すものなのでしょうか?
SysFsObjectのsysfsの sysfs.devices.0000 印刷:80:00.0.numa_node –

+0

、あなたのようなもののため –

+0

を(未フォーマットのpythonのための謝罪コメントに埋め込まれた改行の欠如は、それが不可能コメントでPythonコードを書くことができます) getattr:getattr(sysfs.devices、 "0000:80:00.0")。numa_nodeを使用する必要があります。 Pythonは許されません。そして:識別子の中の数字で始まることもありません。 – filmor

2

:)それはどのような方法で磨かれていないのですが、IIRCそれが動作

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 "<SysFsObject %s>" % 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 __getattribute__(self, name): 
     if name.startswith('_'): 
      return object.__getattribute__(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) 

が、INT()キャストが削除さと:

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 "<SysFsObject %s>" % 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 __getattribute__(self, name): 
     if name.startswith('_'): 
      return object.__getattribute__(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) 

intへの任意のキャストは予期せず、危険です。たとえば、sysfsで一般的なcpulistファイルでこのコードを使用する場合、マルチプロセッサシステムでは常に "0-7"などの文字列が返されます。そしていつか、誰かがあなたのコードをシングルコアシステムで使い、 "0"を含んでいる全く同じsysfsファイルを読むとintを返します。

つまり、そのコードを呼び出し、sysfs(文字列)のネイティブデータ型を受け取る関数は、明示的にstr()にキャストする必要があります。

+1

FYI:[' python-sysfs'](https://github.com/ponycloud/python-sysfs)がこの回答に基づいて存在します。 –