Python配置文件:任何文件格式推荐?INI格式还合适吗?看起来很老派

gec*_*cco 61 python

我需要存储Python应用程序的配置(键/值),我正在寻找将这些配置存储在文件中的最佳方法.

我遇到Python的ConfigParser,我想知道INI文件格式现在是否真的合适?!是否存在更新的格式或INI仍然是推荐的方式?(XML,JSON,...)

请分享您的意见/建议......

cod*_*ape 66

考虑使用普通的Python文件作为配置文件.

一个例子(example.conf):

# 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"}
Run Code Online (Sandbox Code Playgroud)

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

if __name__ == "__main__":
    config = {}
    execfile("example.conf", config) 
    # python 3: exec(open("example.conf").read(), config)

    print config["value1"]
    print config["value5"]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 如果您以后希望能够从GUI更改设置或以任何方式以编程方式设置它们,这也会使其变得棘手.修改声明性上下文文件比修改脚本简单得多. (17认同)
  • 如果程序以root权限运行,则配置文件应具有root-only写权限. (9认同)
  • 我越认为这个解决方案就越好 (4认同)
  • 我真的不喜欢这个.distutils中的`setup.py`事物被改为声明格式,以防止它混淆复杂.这开辟了滥用的可能性(如果声明等).但是,如果您使用`ast`模块解析文件,然后只允许简单的赋值,它可能会起作用. (2认同)
  • 库格尔:管理起来很痛苦.它甚至不读取/执行文件.它导入它,这使得必须手动配置sys.path和所有其他类型的麻烦.从操作角度看真正的噩梦.这可能是我最喜欢Django的观点. (2认同)
  • +1好的解决方案,但是你可能想要执行以下操作:config = {} discard = {} execfile("example.conf",discard,config)否则你的配置dict将受到像python版权一样的全局变量的污染. (2认同)

mac*_*mac 32

INI直到完全没问题,正如其他人所说,配置文件的格式实际上取决于你将如何使用它.

就个人而言,我是YAML的粉丝:简洁,可读,灵活.

Google似乎也赞同我的热情,因为他们也在Google App Engine中使用它.python解析器就在这里.

  • YAML的缺点是你需要一个额外的依赖来解析它. (12认同)
  • YAML为+1.可读,可解析且易于编写. (6认同)

Mat*_*att 9

字典也很受欢迎.基本上是一个哈希表.

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

然后你可以调用它mydict["one"],它会返回1.

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

mydict = shelve.open(filename)
# then you can call it from there, like
mydict["one"]
Run Code Online (Sandbox Code Playgroud)

因此,它比ini文件更容易一些.你可以像列表一样添加内容或者很容易地更改选项,然后一旦你关闭它,它就会把它写回来.

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

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()
Run Code Online (Sandbox Code Playgroud)

  • "注册表"?尔加!得到大蒜和圣水! (11认同)
  • 我不喜欢二进制格式的配置设置.有两个原因:1.您需要一个自定义程序来查看和编辑设置(与基于文本格式的文本编辑器相比)2.二进制配置文件不能轻易地进行版本控制或与其他配置文件进行比较. (2认同)

Con*_*ius 8

这完全取决于您的要求.如果(如你所说)你需要的只是键/值对,ini文件(或其他"普通"配置文件)将完全适合你.不,它们不会过时,因为它们仍在使用中.

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

  • 我建议不要使用JSON,因为(至少使用Python的json解析器)你不能在JSON中有注释. (13认同)

gre*_*ift 6

查看ConfigObj,它是我迄今为止发现的最简单的方法,并且肯定比ConfigParser更灵活.就个人而言,我不是YAML的粉丝,因为它的"灵活性"使其难以与Augeas等工具一起使用.


Sil*_*ght 5

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

INI文件的一个优点是它们非常易于阅读和理解.如果手动编辑配置,在JSON或XML文件中出错会容易得多.PHP仍然使用INI文件.

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