使用Python中的设置文件的最佳做法是什么?

c00*_*ter 308 python settings configuration parsing yaml

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

因此,为了简化操作,我希望使用设置文件来运行脚本.我真的不知道用什么库来解析文件.这样做的最佳做法是什么?我当然可以自己敲一些东西,但是如果有一些库,那我就是耳朵.

一些"要求":

  • 而不是使用pickle我希望它是一个可以轻松阅读和编辑的直接文本文件.
  • 我希望能够在其中添加类似字典的数据,即应该支持某种形式的嵌套.

一个简化的伪示例文件:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2
Run Code Online (Sandbox Code Playgroud)

dug*_*res 203

你可以有一个常规的Python模块,比如config.py,就像这样:

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

并像这样使用它:

import config
print config.truck['color']  
Run Code Online (Sandbox Code Playgroud)

  • 允许"低权限"用户更改更高权限程序的配置可能是一个值得怀疑的设置. (157认同)
  • 这是一个非常糟糕的主意,好像您希望允许低权限用户只能更改配置文件,这样您基本上允许他们潜入特权代码. (59认同)
  • 您可能还会遇到使用py2app等工具打包项目以进行部署的问题.用户可能无法在分发配置文件后对其进行编辑,因为它会使应用程序的签名无效. (15认同)
  • 这个(否则非常方便的选项)的主要缺点是``.py``文件是可执行的,因此在尝试通过``import``加载配置时可以运行任何类型的代码.从安全角度来看,这是不可接受的. (14认同)
  • 使用`ast.literal_eval`无法安全地完成此版本的操作吗?https://docs.python.org/3/library/ast.html#ast.literal_eval (4认同)
  • 这不能防止“低特权”用户更改配置。如果在脚本的开头导入模块,请更改变量之一的值,然后导入其余模块,即使您无权编写配置文件,也可以修改配置值。 (2认同)
  • 也许它不在当前工作目录(cwd)中。在这种情况下,您必须通过使用 os.chdir 更改 cwd(使用 os.getcwd() 了解您所在的位置)或将配置文件位置添加到 PYTHONPATH(不推荐),使其对 Python 可见。希望这可以帮助。 (2认同)

Ben*_*son 153

您提供的示例配置实际上是有效的YAML.事实上,YAML满足您的所有要求,以大量语言实施,并且非常人性化.我强烈建议你使用它.该PyYAML项目提供了一个很好的Python模块,实现YAML.

使用yaml模块非常简单:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))
Run Code Online (Sandbox Code Playgroud)

  • 同意.对于您或编写YAML的用户,[这里是我所知道的最好的YAML参考](http://camel.readthedocs.org/en/latest/yamlref.html).不过,[官方文档](http://yaml.org/)是一个针对实施者的规范,没有别的,但是Eevee的指南非常棒. (13认同)
  • 请注意,yaml 只有在保持非常简单的情况下才是友好的,默认情况下它有大量有问题的、接近不安全的功能。尝试使用 https://hitchdev.com/strictyaml/ 作为默认安全的精简版替代方案。 (5认同)
  • yaml永远是我追求的目标;格式可以从简单到支持嵌入式python代码,标准库可以为您完成繁重的解析和处理工作。 (3认同)
  • 对于不熟悉我们的人,那就是`pip3 install pyyaml`,以准备将其导入到python脚本中。 (2认同)
  • 请参阅[Munch](https://pypi.org/project/munch/)、/sf/ask/3679960861/ `导入yaml;从蒙克导入蒙克化;f = munchify(yaml.load(…)); 打印(fo.d.try)` (2认同)

Mav*_*les 89

我发现这是最有用和易于使用的 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
Run Code Online (Sandbox Code Playgroud)

并检索如下数据:

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

  • 对于Python 3,请使用[configparser](https://docs.python.org/3/library/configparser.html)模块(全部小写) (10认同)
  • 这是最快、最清晰、最容易实现的解决方案,因为没有实现,只有使用。:) 谢谢你! (2认同)
  • 这会支持问题中所要求的嵌套字典吗? (2认同)
  • @JakubBláha 没有。 (2认同)

Ano*_*oop 52

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

  • 使用"json.dump(config,fp,sort_keys = True,indent = 4)"可提高可读性. (21认同)
  • 虽然或多或少相当,但json并不像yaml那样可读.由于他的示例配置实际上是有效的yaml,我会强调而不是json. (13认同)
  • [一个简单的python类,以RAII方式从JSON文件加载其数据成员](https://gist.github.com/nadya-p/b25519cf3a7​​4d1bed86ed9b1d8c71692) (3认同)