web-dev-qa-db-ja.com

pythonプログラムの設定を保存する公式の方法は何ですか?

Djangoは実際のPython=ファイルを設定に使用し、Tracは.iniファイルを使用します。他の一部のソフトウェアはXMLファイルを使用してこの情報を保持します。

これらのアプローチの1つは、GuidoやPythonコミュニティによって他よりも祝福されていますか?

50
Steven Hepting

主な対象読者に依存します。

とにかくファイルを変更するのがプログラマなら、python settings.pyのようなファイルを使用するだけです。

エンドユーザーの場合は、iniファイルについて考えてください。

32
Lakshman Prasad

多くの人が言っているように、「公式の」方法はありません。ただし、多くの選択肢があります。利用可能なオプションの多くについて PyConでの講演 が今年ありました。

30
brianz

これが「公式」と見なされるかどうかはわかりませんが、標準ライブラリ 14.2。ConfigParser —構成ファイルパーサー にあります。

しかし、これは明らかに、普遍的な解決策ではありません。必要な複雑さなしに、タスクに最も適切と思われるものを使用してください(そして、特に-チューリングの完全性!自動またはGUIコンフィギュレーターについて考えてください)。

15
drdaeman

私は棚を使用します( http://docs.python.org/library/shelve.html ):

shelf = shelve.open(filename)
shelf["users"] = ["David", "Abraham"]
shelf.sync() # Save
14
Moshe Revah

もう1つのオプション、PyQt。 Qtには、QSettingsクラスを使用して設定を保存する、プラットフォームに依存しない方法があります。内部では、Windowsではレジストリを使用し、Linuxでは設定を非表示のconfファイルに保存します。 QSettingsは非常にうまく機能し、かなり見た目が良くありません。

9
jhufford

「公式」な方法があるかどうかはわかりません(Python :)のZenでは言及されていません)-Config Parserモジュールを自分で使用する傾向があり、それはかなり一般的です。 pythonファイルアプローチよりも優先します。必要に応じて、ファイルに書き戻し、動的に再ロードできるからです。

6
Shane C. Mason

私の知る限り、祝福された解決策はありません。アプリの設定を保存するための正しい方法も間違った方法もありません。xml、json、またはすべてのタイプのファイルは、快適である限り問題ありません。 pythonの場合、私は個人的に pypref を使用しています。これは非常に簡単で、クロスプラットフォームで簡単です。

pyprefは、静的および動的な設定と設定を保存できるので非常に便利です...

    from pypref import Preferences

    #  create singleton preferences instance
    pref = Preferences(filename="preferences_test.py")

    # create preferences dict
    pdict = {'preference 1': 1, 12345: 'I am a number'}

    # set preferences. This would automatically create preferences_test.py 
    # in your home directory. Go and check it.
    pref.set_preferences(pdict)

    # lets update the preferences. This would automatically update 
    # preferences_test.py file, you can verify that. 
    pref.update_preferences({'preference 1': 2})

    # lets get some preferences. This would return the value of the preference if
    # it is defined or default value if it is not.
    print pref.get('preference 1')

    # In some cases we must use raw strings. This is most likely needed when
    # working with paths in a windows systems or when a preference includes
    # especial characters. That's how to do it ...
    pref.update_preferences({'my path': " r'C:\Users\Me\Desktop' "})

    # Sometimes preferences to change dynamically or to be evaluated real time.
    # This also can be done by using dynamic property. In this example password
    # generator preference is set using uuid module. dynamic dictionary
    # must include all modules name that must be imported upon evaluating
    # a dynamic preference
    pre = {'password generator': "str(uuid.uuid1())"}
    dyn = {'password generator': ['uuid',]}
    pref.update_preferences(preferences=pre, dynamic=dyn)

    # lets pull 'password generator' preferences twice and notice how
    # passwords are different at every pull
    print pref.get('password generator')
    print pref.get('password generator')

    # those preferences can be accessed later. Let's simulate that by creating
    # another preferences instances which will automatically detect the 
    # existance of a preferences file and connect to it
    newPref = Preferences(filename="preferences_test.py")

    # let's print 'my path' preference
    print newPref.get('my path')
6
Cobry

これは、構成の複雑さに大きく依存します。単純なキーと値のマッピングを行っていて、テキストエディターで設定を編集する機能が必要な場合は、ConfigParserが適していると思います。

設定が複雑で、リストやネストされたデータ構造が含まれている場合は、XMLまたはJSONを使用して構成エディターを作成します。

エンドユーザーが設定をあまり変更しないと予想される、またはより信頼できる本当に複雑なものの場合は、Pythonクラスのセットを作成し、Pythonスクリプトを評価して、構成。

4
Kamil Kisiel

使用する最も簡単な方法の1つは、jsonモジュールを使用することです。以下に示すように、ファイルをconfig.jsonに詳細とともに保存します。

Jsonファイルにデータを保存する:

{

    "john"  : {
        "number" : "948075049" , 
        "password":"thisisit" 
    }    
}

Jsonファイルからの読み取り:

import json

#open the config.json file 

with open('config.json') as f:
    mydata = json.load(f) ; 

#Now mydata is a python dictionary 

print("username is " , mydata.get('john').get('number') , " password is " , mydata.get('john').get('password')) ;
3
Natesh bhat

OS環境変数を使用したいWebアプリケーションの場合:os.environ.get('CONFIG_OPTION')

これは、デプロイ間で異なる設定に対して特に有効です。 env varsを使用する背後にある根拠について詳しくは、こちらをご覧ください。 http://www.12factor.net/config

もちろん、環境への変更は通常永続的ではないため、これは読み取り専用の値に対してのみ機能します。しかし、書き込みアクセスが必要ない場合は、非常に優れたソリューションです。

2
dbader

なぜグイドは彼の範囲外の何かを祝福したのですか?特に祝福されているものはありません。

0
SilentGhost

それはより便利です。発言ごとに公式な方法はありません。ただし、XMLファイルは他のさまざまなアプリケーション/ライブラリで操作できるため、XMLファイルを使用することには意味があります。

0
Checksum