【问题标题】:What's the best practice using a settings file in Python? [closed]在 Python 中使用设置文件的最佳做法是什么? [关闭]
【发布时间】:2011-06-30 14:45:22
【问题描述】:

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

所以为了简化事情,我想用设置文件来运行脚本。我真的不知道要使用哪些库来解析文件。这样做的最佳做法是什么?我当然可以自己敲出一些东西,但是如果有一些图书馆可以解决这个问题,我会全力以赴。

一些“要求”:

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

一个简化的伪示例文件:

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

【问题讨论】:

  • 此示例文件的特定语法实际上是 YAML,请查看 Benson 的答案。
  • 我建议使用python-box,见answer
  • 我建议尝试一下trapdoor 的交钥匙配置(免责声明:我是陷门的作者)。

标签: python parsing configuration yaml settings


【解决方案1】:

你可以有一个普通的 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'])  

【讨论】:

  • 允许“低权限”用户更改配置以获得更高权限的程序可能是一个有问题的设置。
  • 您还可能会遇到使用 py2app 等工具打包项目以进行部署的问题。配置文件分发后,用户可能无法对其进行编辑,因为这会使应用程序的签名无效。
  • 这个(否则非常方便的选项)的主要缺点是.py 文件是可执行的,因此在尝试通过import 加载配置时可以运行任何类型的代码。从安全角度来看,这是不可接受的。
  • 不能用ast.literal_eval 安全地完成这个版本吗? docs.python.org/3/library/ast.html#ast.literal_eval
【解决方案2】:

您提供的示例配置实际上是有效的YAML。事实上,YAML 可以满足您的所有需求,以多种语言实现,并且非常人性化。我强烈建议您使用它。 PyYAML project 提供了一个不错的 python 模块,它实现了 YAML。

使用yaml模块非常简单:

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

【讨论】:

  • yaml 总是我求助的对象;格式可以从非常简单到支持嵌入式 python 代码,标准库为您完成了繁重的解析和清理工作。
  • 同意。对于您或编写 YAML 的用户,here is the best YAML reference that I know of。不幸的是,official documentation 是针对实施者的规范,仅此而已,但 Eevee 的指南非常棒。
  • 对于我们外行来说,pip3 install pyyaml 准备好导入 python 脚本。
  • 当心,yaml 只有在你保持非常简单的情况下才友好,默认情况下它有很多问题,接近不安全的功能。尝试使用hitchdev.com/strictyaml 作为默认安全的精简版替代方案。
  • Munch, stackoverflow.com/questions/52570869/… import yaml; from munch import munchify; f = munchify(yaml.load(…)); print(fo.d.try)
【解决方案3】:

我发现这是最有用且易于使用的 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'

【讨论】:

  • 对于 Python 3,请改用 configparser 模块(全部小写)
  • 这是最快、最清晰、最容易实现的解决方案,因为没有实现,只是使用。 :) 谢谢!
  • 这会支持问题中提出的嵌套字典吗?
  • @JakubBláha no.
【解决方案4】:

Yaml 和 Json 是存储设置/配置的最简单和最常用的文件格式。 PyYaml 可用于解析 yaml。从 2.5 开始,Json 已经是 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}

【讨论】:

猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多