Python:体面的配置文件格式

时间:2010-06-09 16:27:13

标签: python configuration parsing configuration-files config

我想使用一种配置文件格式,它支持键值对和可嵌套,可重复的结构,并且尽可能轻松地使用语法。我想象的是:

cachedir = /var/cache
mail_to = me@example.org

job {
   name = my-media
   frequency = 1 day
   source {
      from = /home/michael/Images

   source { }
   source { }       
}

job { }

我也很高兴使用重要的空格。

JSON需要太多明确的语法规则(引用,逗号等)。 YAML实际上非常好,但是需要将作业定义为YAML列表,我觉得使用起来有些尴尬。

6 个答案:

答案 0 :(得分:13)

我认为YAML非常适合这个目的,实际上:

jobs:
 - name: my-media
   ...

 - name: something else
   ...

或者,作为dict而不是list:

jobs:
  my-media:
    frequency: 1 day
    ...
  something-else:
    frequency: 2 day
    ...

您可能没有考虑的另一件事是使用Python源进行配置。您可以以非常易读的方式嵌套Python dicts和列表,并提供多种意想不到的好处。例如,Django将Python源用于其设置文件。

答案 1 :(得分:10)

由于Python的内置configparser模块似乎不支持嵌套部分,我首先尝试ConfigObj。 (参见介绍性教程here)。根据其主页,这是一组值得一提的功能:

  • 嵌套部分(子部分),任何级别
  • 列出值
  • 多行值
  • 字符串插值(替换)
  • 集成了强大的验证系统
    • 包括自动类型检查/转换
    • 重复部分
    • 并允许默认值
  • 在写出配置文件时,ConfigObj会保留所有注释以及成员和部分的顺序
  • 使用配置文件的许多有用方法和选项(如'reload'方法)
  • 完全支持Unicode
Baza,Trac,IPython,matplotlib和许多其他大型Python项目都使用了

ConfigObj,所以它看起来非常成熟和稳定(虽然我自己从未使用过它)。

答案 2 :(得分:2)

我认为您应该检查libconfig库http://www.hyperrealm.com/libconfig/。 应该有一些python绑定。

另一个解决方案是使用已经由python本身提供的json格式。搜索JSON模块的文档。

答案 3 :(得分:1)

为什么重新发明轮子?您可以使用:

http://docs.python.org/library/configparser.html

答案 4 :(得分:0)

您可以使用red-dove的配置系统。

http://www.red-dove.com/config-doc/

答案 5 :(得分:0)

如果您的需求超出其他选项,您也可以考虑Jsonnet。 Jsonnet是JSON的扩展,乍一看增加了注释,放宽了逗号规则,并且不再需要这么多引用。但是如果你看得更深,你会发现它确实提供了一个完整的函数式编程语言,并且通过mixins,文件导入等支持模板扩展。它有一个Python绑定,但它的实际实现是C ++。