第30章-配置

python附带了一个名为 ConfigParser .它有助于创建和读取配置文件(也称为ini文件)。然而,Michael Foord(Ironpython in Action的作者)和Nicola Larosa决定编写自己的配置模块,名为 ConfigObj .在许多方面,它是对标准库模块的改进。例如,它将在读取配置文件时返回类似字典的对象。configobj还可以理解一些Python类型。另一个很好的特性是,您可以创建一个配置规范,configobj将使用它来验证配置文件。

入门

首先,你需要去得到configobj。现在是利用上一章关于安装软件包的知识的好时机。下面是如何通过pip获得configobj:

pip install configobj

一旦你安装好了,我们就可以继续了。要开始,请打开文本编辑器并创建包含以下内容的文件:

product = Sony PS3
accessories = controller, eye, memory stick
# This is a comment that will be ignored
retail_price = $400

随时随地保存。我要打电话给我的 config.ini .现在,让我们看看如何使用configobj提取这些信息:

>>> from configobj import ConfigObj
>>> config = ConfigObj(r"path to config.ini")
>>> config["product"]
'Sony PS3'
>>> config["accessories"]
['controller', 'eye', 'memory stick']
>>> type(config["accessories"])
<type 'list'>

如您所见,configobj使用python的 dict 用于访问已提取信息的API。要让configobj解析文件,只需将文件路径传递给configobj。现在,如果信息属于某一部分(即 [Sony] ,那么你就必须用 [“索尼”] ,像这样: [config["Sony"]["product"]] .还要注意, 配件 节作为字符串列表返回。configobj将采用逗号分隔列表的任何有效行,并将其作为python列表返回。也可以在配置文件中创建多行字符串,只要用三个单引号或双引号将其括起来。

如果需要在文件中创建子节,请使用额外的方括号。例如, [[Sony]] 是最上面的部分, [[[Playstation]]] 是分部和 [[[[PS3]]]] 是子节的子节。可以创建任意深度的子截面。有关文件格式的更多信息,我建议您阅读configobj的文档。

现在,我们将执行相反的操作,并以编程方式创建配置文件。

import configobj

def createConfig(path):
    config = configobj.ConfigObj()
    config.filename = path
    config["Sony"] = {}
    config["Sony"]["product"] = "Sony PS3"
    config["Sony"]["accessories"] = ['controller', 'eye', 'memory stick']
    config["Sony"]["retail price"] = "$400"
    config.write()

if __name__ == "__main__":
    createConfig("config.ini")

如你所见,只需要13行代码。在上面的代码中,我们创建一个函数并将配置文件的路径传递给它。然后我们创建一个configobj对象并设置其文件名属性。为了创建分区,我们创建了一个名为“Sony”的空dict。然后我们以相同的方式预先挂起每一行部分的内容。最后,我们调用配置对象的写入方法将数据写入文件。

使用configspec

configobj还提供了一种使用 配置规范 .当我提到我要写这个主题时,StevenSproat(Whyteboard的创建者)自愿将他的configspec代码作为一个例子。我获取了他的规范并使用它创建了一个默认配置文件。在本例中,我们使用food的validate模块进行验证。我不认为它包含在你的configobj下载中,所以你可能也需要下载它。现在,让我们看一下代码:

import configobj, validate

cfg = """
bmp_select_transparent = boolean(default=False)
canvas_border = integer(min=10, max=35, default=15)
colour1 = list(min=3, max=3, default=list('280', '0', '0'))
colour2 = list(min=3, max=3, default=list('255', '255', '0'))
colour3 = list(min=3, max=3, default=list('0', '255', '0'))
colour4 = list(min=3, max=3, default=list('255', '0', '0'))
colour5 = list(min=3, max=3, default=list('0', '0', '255'))
colour6 = list(min=3, max=3, default=list('160', '32', '240'))
colour7 = list(min=3, max=3, default=list('0', '255', '255'))
colour8 = list(min=3, max=3, default=list('255', '165', '0'))
colour9 = list(min=3, max=3, default=list('211', '211', '211'))
convert_quality = option('highest', 'high', 'normal', default='normal')
default_font = string
default_width = integer(min=1, max=12000, default=640)
default_height = integer(min=1, max=12000, default=480)
imagemagick_path = string
handle_size = integer(min=3, max=15, default=6)
language = option('English', 'English (United Kingdom)', 'Russian',
                  'Hindi', default='English')
print_title = boolean(default=True)
statusbar = boolean(default=True)
toolbar = boolean(default=True)
toolbox = option('icon', 'text', default='icon')
undo_sheets = integer(min=5, max=50, default=10)
"""

def createConfig(path):
    """
    Create a config file using a configspec
    and validate it against a Validator object
    """
    spec = cfg.split("\n")
    config = configobj.ConfigObj(path, configspec=spec)
    validator = validate.Validator()
    config.validate(validator, copy=True)
    config.filename = path
    config.write()

if __name__ == "__main__":
    createConfig("config.ini")

configspec允许程序员指定 类型 为配置文件中的每一行返回。它还可以用于设置默认值和 minmax 价值观(除其他外)。如果运行上面的代码,您将看到 config.ini 在只有默认值的当前工作目录中生成的文件。如果程序员没有指定默认值,那么该行甚至没有添加到配置中。

让我们仔细看看发生了什么,以确保您理解。在 创建配置 函数,我们通过传入文件路径并设置configspec来创建configbj实例。注意,configspec也可以是普通文本文件或python文件,而不是本例中的字符串。接下来,我们创建一个验证器对象。通常的用法是调用config.validate(validator),但在这段代码中,我将copy参数设置为true,以便创建一个文件。否则,它所要做的就是验证我传入的文件是否符合configspec的规则。最后,我设置配置文件名并写出数据。

总结

现在你知道了足够让你开始对configobj的进进出出。我希望你会发现它和我一样有用。一定要阅读模块的文档,了解更多关于它和 验证 能做到。