Python配置文件:任何文件格式推荐?

Python configuration file: Any file format recommendation? INI format still appropriate? Seems quite old school

我需要为python应用程序存储配置(key/value),我正在寻找将这些配置存储在文件中的最佳方法。

我遇到了python的configparser,我想知道现在ini文件格式是否仍然合适?!是否存在更为最新的格式,或者INI仍然是推荐的方式?(XML、JSON等)

请分享您的意见/建议…


考虑使用普通的python文件作为配置文件。

示例(example.conf

1
2
3
4
5
6
7
8
# use normal python comments

value1 = 32
value2 = u"A unicode value"
value3 ="A plain string value"

value4 = ["lists","are","handy"]
value5 = {"and":"so","are":"dictionaries"}

在程序中,使用execfile加载配置文件(2.7文档):

1
2
3
4
5
6
7
if __name__ =="__main__":
    config = {}
    execfile("example.conf", config)
    # python 3: exec(open("example.conf").read(), config)

    print config["value1"]
    print config["value5"]

我喜欢这种方法,原因如下:

  • 在简单的情况下,格式和ini样式的配置文件一样容易编写。它还与ini文件共享一个重要特性:它非常适合于版本控制(对于XML和JSON来说,这一点可能不太正确)
  • 我喜欢在实际编程语言中使用配置文件所带来的灵活性。

这种方法被广泛使用,举几个例子:

  • Django站点的设置位于settings.py中。Django不使用execfile,它使用import读取/执行settings.pyafaik,但最终结果是相同的:执行设置文件中的代码。
  • bash shell在启动时读取并执行~/.bashrc
  • python解释器在启动时导入(并执行)site.py


ini直到完全正常为止,正如其他人所说,配置文件的格式实际上取决于您将如何使用它。

我个人喜欢山药:简洁,易读,灵活。

谷歌似乎和我一样有热情,因为他们也在谷歌应用引擎中使用它。这里是python解析器。


字典也很流行。基本上是一个哈希表。

{"one": 1,"two": 2}就是一个例子,有点像json。

然后你可以像mydict["one"]那样调用它,它将返回1。

然后可以使用shelve将字典保存到文件:

1
2
3
mydict = shelve.open(filename)
# then you can call it from there, like
mydict["one"]

所以,它比一个ini文件简单一些。您可以很容易地添加列表或更改选项等内容,然后关闭它,它会将其写回。

下面是一个简单的例子,我的意思是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import shelve

def main():
    mydict = shelve.open("testfile")
    mydict["newKey"] = value("some comment", 5)
    print(mydict["newKey"].value)
    print(mydict["newKey"].comment)
    mydict.close()


class value():
    def __init__(self, comment, value):
        self.comment = comment
        self.value = value



if __name__ == '__main__':
    main()


这完全取决于您的需求。如果您只需要密钥/值对(如您所说),那么ini文件(或其他"普通"配置文件)将非常适合您。不,它们没有过时,因为它们还在使用中。

如果您有层次结构,并且还想使用更复杂的方法(例如:XML文件验证、名称空间等),那么XML/JSON是完美的。


看看configobj,这是迄今为止我发现的最巧妙的方法,而且绝对比configparser更灵活。就我个人而言,我不喜欢Yaml,因为它的"灵活性"使它难以与Augeas等工具一起使用。


这取决于配置文件的使用方式。

ini文件的一个优点是它们非常容易阅读和理解。如果手工编辑配置,那么在JSON或XML文件中犯错误就容易多了。PHP仍然使用ini文件。

但是,如果您的配置不是手工编辑的,请使用您喜欢的任何格式,因为ini不是最容易解析的格式。


我不止一次碰到同样的问题。我喜欢将python文件作为设置文件的想法,它简单、优雅,所有的python开发人员都喜欢它。同时也不太相信Execfile的想法。

所以我继续创建了Converge。

它支持一些高级选项,但它的核心是简单的python模块作为设置文件。

这很简单

  • 创建default_settings.pyprod_settings.py
  • pip install converge
  • import settings

为了完整性起见,您还可以在"shlex"模块的帮助下使用shell样式的配置格式。如果您有一组固定的配置参数,那么您可以将其与"optparse"模块结合起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from optparse import OptionParser
_o = OptionParser("%prog [options] configfiles...")
_o.add_option("--hostname", metavar="HOSTNAME", default="10.0.0.1")
_o.add_option("--username", metavar="USERNAME", default="admin")
_o.add_option("--password", metavar="PASSWORD", default="admin")

import shlex
def parse(filename, defaults):
    opt, args = _o.parse_args(shlex.split(open(filename).read()), defaults)
    return opt

if __name__ =="__main__":
    import sys
    values, args = _o.parse_args()
    for arg in args:
       values = parse(arg, values)
    values, args = _o.parse_args(values = values)
    for name in _o.defaults:
        print name,"=", getattr(values, name)

该示例显示如何为具有默认值集和用户定义的重定义而链接ini文件。假设你有两个文件

文件1.II:

1
2
--hostname 10.2.3.4
--password admin-sc

文件2.II:

1
2
--username"foo bar"
--password"special key"

然后可以运行./configtest.py file1.ini file2.ini --password other,得到的值的主机名为10.2.3.4,用户名为"foo bar",密码为"other"。如果您已经有了程序参数的optparse定义,那么配置设置的这种变化就很方便了——只需重用它,您可以将命令行中的值与配置文件中的值以及可能的一些全局配置设置链接起来。

作为一种激励,您的配置参数总是有文档记录的,错误的配置参数会在出现错误之前出现,正如您可以使用optparse实例预检查默认设置文件(模式检查)一样。不利的是,在ini中不允许有注释,配置元素不容易被子结构化。不过,您的解析器本质上还是一个单行程序。