在Python中使用设置文件的最佳做法是什么?[关闭]


332

我有一个运行有很多参数的命令行脚本。现在到了我有太多参数的地步,我也想以字典形式有一些参数。

因此,为了简化操作,我想使用设置文件来运行脚本。我真的不知道该使用什么库来解析文件。最佳做法是什么?我当然可以自己动手做一些事情,但是如果有图书馆可以帮助我,我会不胜枚举。

一些“需求”:

  • 与其使用pickle我,我不希望它是一个易于阅读和编辑的简单文本文件。
  • 我希望能够在其中添加类似字典的数据,即应支持某种形式的嵌套。

简化的伪示例文件:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2

6
此示例文件的特定语法实际上是YAML,请查看Benson的答案。
Skippy le Grand Gourou

Answers:


231

您可以有一个常规的Python模块,例如config.py,如下所示:

truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

并像这样使用它:

import config
print config.truck['color']  

69
这是一个非常糟糕的主意,就像您只想允许低特权用户只能更改配置文件一样,这样实际上是在允许他们潜入特权代码。
nikolay 2012年

171
无论如何,允许“低特权”用户更改特权更高的程序的配置可能都是有问题的设置。
XTL 2012年

18
您还可能遇到打包项目以使用诸如py2app之类的工具进行部署的问题。分发后,用户可能无法编辑配置文件,因为它将使应用程序的签名无效。
bschwagg

18
这样做的主要缺点(否则是非常方便的选择)是.py文件是可执行文件,因此在尝试通过加载配置时可以运行任何类型的代码import。从安全角度来看,这是不可接受的。
阿巴拉拉

5
无法安全地完成此版本ast.literal_eval吗?docs.python.org/3/library/ast.html#ast.literal_eval
安德烈C.安德森

169

您提供的样本配置实际上是有效的YAML。实际上,YAML可以满足您的所有需求,并以多种语言实现,并且非常人性化。我强烈建议您使用它。该PyYAML项目提供了一个很好的Python模块,实现YAML。

使用yaml模块非常简单:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))

3
yaml永远是我追求的目标;格式可以从简单到支持嵌入式python代码,标准库为您提供了繁重的解析和卫生处理。
Todor Minakov

15
同意 对于您或编写YAML的用户,这是我所了解的最佳YAML参考。不幸的是,正式文档是针对实施者的规范,仅此而已,但是Eevee的指南很棒。
Esteis

5
对于我们而言,这是pip3 install pyyaml为了让它准备好导入到python脚本中。
user8675309 '19

2
当心,yaml仅在您保持非常简单的情况下才是友好的,默认情况下,它有很多问题,与不安全的功能接壤。尝试使用hitchdev.com/strictyaml作为默认的安全精简版替代方案。
Gringo Suave

106

我发现这是最有用和易于使用的 https://wiki.python.org/moin/ConfigParserExamples

您只需创建一个“ myfile.ini”,例如:

[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True

[SectionTwo]
FavoriteColor=Green
[SectionThree]
FamilyName: Johnson

[Others]
Route: 66

并像这样检索数据:

>>> import ConfigParser
>>> Config = ConfigParser.ConfigParser()
>>> Config
<ConfigParser.ConfigParser instance at 0x00BA9B20>
>>> Config.read("myfile.ini")
['c:\\tomorrow.ini']
>>> Config.sections()
['Others', 'SectionThree', 'SectionOne', 'SectionTwo']
>>> Config.options('SectionOne')
['Status', 'Name', 'Value', 'Age', 'Single']
>>> Config.get('SectionOne', 'Status')
'Single'

20
对于Python 3,请改用configparser模块(所有小写字母)
Roland

2
这是最快,最清晰,最容易实现的解决方案,因为没有实现,只有使用。:) 谢谢!
Aleksandar '18年

这样是否会支持问题中所要求的嵌套字典?
雅各布·布拉哈

54

Yaml和Json是存储设置/配置的最简单,最常用的文件格式。PyYaml可用于解析yaml。Json已经从2.5开始成为python的一部分。Yaml是Json的超集。Json将解决大多数使用情况,但需要转义的多行字符串除外。Yaml也会处理这些情况。

>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))   
{u'handler': u'adminhandler.py', u'timeoutsec': 5}

13
虽然JSON差不多,但其可读性却不如yaml。由于他的示例配置实际上是有效的Yaml,因此我要强调它而不是json。
本森

23
使用“ json.dump(config,fp,sort_keys = True,indent = 4)”可提高可读性。
phobie

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.