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文件作为配置文件。
示例(
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"} |
在程序中,使用
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.py afaik,但最终结果是相同的:执行设置文件中的代码。 - bash shell在启动时读取并执行
~/.bashrc 。 - python解释器在启动时导入(并执行)
site.py 。
ini直到完全正常为止,正如其他人所说,配置文件的格式实际上取决于您将如何使用它。
我个人喜欢山药:简洁,易读,灵活。
谷歌似乎和我一样有热情,因为他们也在谷歌应用引擎中使用它。这里是python解析器。
字典也很流行。基本上是一个哈希表。
然后你可以像
然后可以使用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.py ,prod_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" |
然后可以运行
作为一种激励,您的配置参数总是有文档记录的,错误的配置参数会在出现错误之前出现,正如您可以使用optparse实例预检查默认设置文件(模式检查)一样。不利的是,在ini中不允许有注释,配置元素不容易被子结构化。不过,您的解析器本质上还是一个单行程序。