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 2017年

回答:


231

次のように、config.pyなどの通常のPythonモジュールを使用できます。

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
権限の低いユーザーが設定ファイルのみを変更できるようにしたい場合、これはかなり悪い考えです。このようにして、基本的にユーザーに権限のあるコードを忍び込ませることができます。
ニコライ

172
「特権の低い」ユーザーがより特権の高いプログラムの構成を変更できるようにすることは、おそらく疑わしい設定です。
XTL

18
py2appなどのツールを使用して、プロジェクトをデプロイ用にパッケージ化する際に問題が発生する場合もあります。アプリの署名が無効になるため、配布された設定ファイルをユーザーが編集できない場合があります。
bschwagg 2015年

18
これの主な短所(そうでなければ非常に便利なオプション)は、.pyファイルが実行可能であるため、を介して構成をロードしようとすると、あらゆる種類のコードが実行される可能性がありますimport。これはセキュリティの観点から受け入れられません。
Apalala、2016

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、2015年

15
同意した。YAMLを作成しているユーザーまたはユーザーのために、私が知っているYAMLの最良のリファレンスを紹介します公式ドキュメントは、残念ながら実装を目的とした仕様、および何もないですが、イーブイのガイドが素晴らしいです。
Esteis

5
初心者にとっては、それpip3 install pyyamlをPythonスクリプトにインポートする準備をすることです。
user8675309

2
注意してください。yamlは、非常にシンプルに保つ場合にのみ友好的です。デフォルトでは、安全でない機能に接する問題が山ほどあります。代わりにデフォルトで安全なライトの代替としてhitchdev.com/strictyamlを試してください。
Gringo Suave

107

私はこれが最も便利で使いやすいと 感じました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

質問で尋ねられたように、これはネストされた辞書をサポートしますか?
JakubBláha19年

54

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}

13
ほぼ同等ですが、jsonはyamlほど人間が読めるものではありません。彼のサンプル設定は実際には有効なyamlなので、jsonではなく強調します。
Benson

23
「json.dump(config、fp、sort_keys = True、indent = 4)」を使用すると、読みやすくなります。
phobie 2013

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.