Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有python模块来解析Linux';什么是系统?_Python_Linux_Internals - Fatal编程技术网

是否有python模块来解析Linux';什么是系统?

是否有python模块来解析Linux';什么是系统?,python,linux,internals,Python,Linux,Internals,嘿,大家好,Linux在procfs和sysfs中有很多很棒的特性,像vmstat这样的工具扩展了很多,但是我需要从这些系统中收集数据,并且希望利用一个统一的Python实用程序,而不是将一堆不同的脚本拼凑在一起 为了做到这一点,我首先需要确定Python是否具有充分解析/处理不同数据收集点所需的位和块。因此,我的问题的实质是: 是否已经有python模块处理/解析sysfs对象了 我已经通过谷歌、usenet和各种论坛寻找过这样的野兽,但我还没有发现任何智能或功能性的东西。所以,在我刻一个之前

嘿,大家好,Linux在
procfs
sysfs
中有很多很棒的特性,像
vmstat
这样的工具扩展了很多,但是我需要从这些系统中收集数据,并且希望利用一个统一的Python实用程序,而不是将一堆不同的脚本拼凑在一起

为了做到这一点,我首先需要确定Python是否具有充分解析/处理不同数据收集点所需的位和块。因此,我的问题的实质是:

是否已经有python模块处理/解析
sysfs
对象了


我已经通过谷歌、usenet和各种论坛寻找过这样的野兽,但我还没有发现任何智能或功能性的东西。所以,在我刻一个之前,我想我应该先检查一下这里。

不太清楚为什么你需要一些特定的东西,它们大部分都是文本文件,你可以直接处理它们。
据我所知,没有任何python模块可以做到这一点。

试试这个:

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)
从操作系统导入listdir
从os.path导入isdir、isfile、islink、join、realpath、normpath
从关键字导入iskeyword
_norm=lambda name:name+(“如果”是关键字(name)else“”)
定义名称(名称):
如果name.endswith(“”)和iskeyword(name[:-1]):
返回名称[:-1]
其他:
返回名称
定义规范路径(路径):
返回normpath(realpath(path))
类SysFsObject(对象):
__插槽uuu=[''路径',''指令uuuuu']
@静力学方法
定义id参数(路径='/sys'):
返回标准路径(路径)
定义初始化(self,path='/sys'):
self.\u path=\u norm\u path(path)
如果不是self._path.startswith('/sys'):
raise RUNTIMERROR(“在非sysfs文件上使用此选项是危险的!”)
self.\u dict.\u.update(dict.fromkeys(\u norm(i)表示listdir(self.\u path)中的i)))
定义报告(自我):
返回“%self.\u路径
定义设置属性(self、name、val):
如果name.startswith(“”“”):
返回对象。\uuuu setattr\uuuuu(self、name、val)
名称=\名称(名称)
p=realpath(连接(self.\u路径,名称))
如果是ISP文件(p):
文件(p,'w')。写入(str(val))
其他:
引发运行时错误
def uu getattribute_uu(self,name):
如果name.startswith(“”“”):
返回对象。\uuuGetAttribute(self,name)
名称=\名称(名称)
p=realpath(连接(self.\u路径,名称))
如果是ISP文件(p):
data=open(p,'r').read()[:-1]
尝试:
返回整数(数据)
除值错误外:
返回数据
elif isdir(p):
返回SysFsObject(p)

它没有经过任何修饰,但IIRC可以工作:)

来自filmor的回答,但是去掉了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)
从操作系统导入listdir
从os.path导入isdir、isfile、islink、join、realpath、normpath
从关键字导入iskeyword
_norm=lambda name:name+(“如果”是关键字(name)else“”)
定义名称(名称):
如果name.endswith(“”)和iskeyword(name[:-1]):
返回名称[:-1]
其他:
返回名称
定义规范路径(路径):
返回normpath(realpath(path))
类SysFsObject(对象):
__插槽uuu=[''路径',''指令uuuuu']
@静力学方法
定义id参数(路径='/sys'):
返回标准路径(路径)
定义初始化(self,path='/sys'):
self.\u path=\u norm\u path(path)
如果不是self._path.startswith('/sys'):
raise RUNTIMERROR(“在非sysfs文件上使用此选项是危险的!”)
self.\u dict.\u.update(dict.fromkeys(\u norm(i)表示listdir(self.\u path)中的i)))
定义报告(自我):
返回“%self.\u路径
定义设置属性(self、name、val):
如果name.startswith(“”“”):
返回对象。\uuuu setattr\uuuuu(self、name、val)
名称=\名称(名称)
p=realpath(连接(self.\u路径,名称))
如果是ISP文件(p):
文件(p,'w')。写入(val)
其他:
引发运行时错误
def uu getattribute_uu(self,name):
如果name.startswith(“”“”):
返回对象。\uuuGetAttribute(self,name)
名称=\名称(名称)
p=realpath(连接(self.\u路径,名称))
如果是ISP文件(p):
返回open(p,'r')。read()[:-1]
elif isdir(p):
返回SysFsObject(p)
任意转换为int是意外的,甚至是危险的。例如,如果要在sysfs中流行的任何cpulist文件上使用该代码,则在多处理器系统上始终会返回“0-7”之类的字符串。然后有一天,有人在单核系统上使用您的代码,并读取现在包含“0”的完全相同的sysfs文件,返回一个int


换句话说,任何调用该代码并希望接收本机数据类型sysfs(strings)的函数都必须显式强制转换为str()。

duh?这样一个模块的目的是适应以结构化的方式读取文件。。。i、 e.sysfs.thermal_zone0.temp如何使用此功能?查找是否类似于以下内容,例如numa节点
SysFsObject sysfs print sysfs.devices.0000:80:00.0.numa_节点(对未格式化的python表示歉意;注释中缺少内嵌的换行符使得无法在注释中编写python代码)对于类似的内容,您必须使用getattr:getattr(sysfs.devices,“0000:80:00.0”).numa_节点。Python两者都不允许。和:也不是以标识符中的数字开头。不幸的是,这些实现似乎都没有处理sysfs文件的形式,这些文件总是返回多个选项,并将所选选项放在括号中。我使用类似这样的方法来读取sysfs值。顺便问一下,你怎么能在评论中提供代码片段?def sysfs_read(path):f=open(path,“r”)text=f.read()f.close()text=text.strip()如果文本中没有“[”,则返回文本垃圾,在第一个括号之后=text.split('[')值,垃圾=在第一个括号之后