web-dev-qa-db-ja.com

Pythonで設定ファイルを使用するベストプラクティスは何ですか?

私はたくさんの引数を付けて実行するコマンドラインスクリプトを持っています。私は今、私はあまりにも多くの引数を持つようになったので、辞書形式でもいくつかの引数を持ちたいと思います。

それで、物事を単純化するために、代わりに設定ファイルでスクリプトを実行したいと思います。ファイルの解析にどのライブラリを使用すればよいのか、私にはよくわかりません。これを行うためのベストプラクティスは何ですか?もちろん自分で何かを打ち出すこともできますが、そのためのライブラリがあれば、すべて耳にします。

いくつかの「要求」:

  • pickleを使うのではなく、簡単に読んで編集できるテキストファイルにしたいのです。
  • その中に辞書のようなデータを追加できるようにしたいのです。つまり、何らかの形のネストをサポートする必要があります。

簡単な疑似サンプルファイル:

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

このように、通常の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']  
182
dugres

あなたが提供したサンプル設定は実際に有効です YAML 。実際、YAMLはあなたの要求すべてを満たし、多数の言語で実装され、そして非常に人間に優しいものです。私はあなたがそれを使うことを強く勧めます。 PyYAMLプロジェクト は、YAMLを実装するNice pythonモジュールを提供します。

Yamlモジュールを使うのはとても簡単です。

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

私はこれが最も便利で使いやすいことがわかりました 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'
79
Maviles

YamlとJsonはsettings/configを保存するための最も単純で最も一般的に使用されるファイルフォーマットです。 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}
49
Anoop