使用shlex编写的基于规则的unix样式配置分析器
oshlex的Python项目详细描述
oshlex(object shlex)-编写基于规则的unix样式配置分析器 使用shlex
这是一个简化阅读和分析任务的项目 Unix样式的配置文件。它只是一个抽象,使用shlex 库,通过 创建一组规则和处理程序,然后用于转换 标记到python数据结构中。
警告:目前只支持python>;3.4,python2.7 计划在不久的将来提供支持。
安装
您可以使用pip从pypi安装这个包。 鉴于Python2.7还不受支持,您可以按照 如下:
pip3.4 install oshlex
配置语法
默认情况下,配置文件语法尝试遵循标准 Unix配置文件语法,如中所示,例如nginx configs。 通过简单地子类化tokenizer类,或者创建 自己的类,其工作方式与shlex.shlex类相同(读取 详细信息)
示例配置文件
server { host 127.0.0.1; port 10000; user { username admin; password admin; } user { username test; password test; } }
用法
oshlex.config有两个基本类,rule和configuration。
oshlex.handlers有两个预定义的处理程序(文本和整数)
创建规则
在本例中,我们定义了一些规则来解析示例配置 文件,如上图所示。
基本思想是创建根规则并将其传递给配置 初始化时的对象。因此,所有其他规则都是 “根”规则。
规则类接受以下参数:
name-规则的名称,默认为“根”
handler-handler函数,接受令牌列表和 输出要在应用程序中使用的python数据结构。 oshlex.handlers模块有两个预定义的处理函数-text, 它接受一个令牌列表并将第一个令牌作为字符串返回,或者 如果令牌列表包含 不止一个元素,还有integer,其功能基本相同 只返回pythonint对象,或者引发unacceptabletoken 如果令牌不能转换为int类型,则出现异常。默认为 none,这意味着令牌由python字典表示 和副官。
unique-bool,定义所述选项是否可以接受 在配置文件中定义多次。如果true,则引发 如果在同一位置的两个位置定义了选项,则出现configerror异常 时间。如果false,则将每次出现的选项定义追加到 名单。默认为false
mandatory-bool,非常简单,如果选项是强制性的,但是 未定义-引发mandatoryoptionmissing异常,否则 没有什么。
基本示例
fromoshlex.configimportRule,Configurationfromoshleximporthandlers# Defining rulesroot=Rule('root')server=Rule('server',unique=True,mandatory=True)host=Rule('host',handler=handlers.text,unique=True,mandatory=True)port=Rule('port',handler=handlers.integer,unique=True,mandatory=True)user=Rule('user',unique=False,mandatory=False)username=Rule('username',handler=handlers.text,unique=True,mandatory=True)password=Rule('password',handler=handlers.text,unique=True,mandatory=True)# Chaining rules togetheruser.add(username)user.add(password)server.add(host)server.add(port)server.add(user)root.add(server)conf=Configuration(root)conf.read('./example.conf')
这样我们就得到了配置对象(conf),其内容如下 结构:
{'server':{'host':'127.0.0.1','port':10000,'user':[{'password':'admin','username':'admin'},{'password':'test','username':'test'}]}}
配置对象是可订阅的,因此您可以使用 此处允许使用词典:
>>>conf['server']['host']'127.0.0.1'
您可以定义自己的处理程序,这些处理程序只是接受 标记列表并返回python可以使用的内容,如果 需要以其他方式解析给定的令牌,例如 选项接受范围(例如1-10),然后我们需要定义一个hadler 为了将这些范围转换成整数列表,我们编写了一个处理程序:
fromoshlex.handlersimportUnacceptableToken,UnacceptableTokenCountdefrange(tokens):iflen(tokens)>1:raiseUnacceptableTokenCount('This handler accepts 1 token at most')try:start,end=[int(token)fortokenintokens[0].split('-')]exceptExceptionase:raiseUnacceptableToken('Couldn\'t process token {}, got {}'.format(tokens[0],e))return[iforiinrange(start,end)]