Какой официальный способ хранения настроек для программ на Python? - PullRequest
48 голосов
/ 08 июня 2009

Django использует настоящие файлы Python для настроек, Trac использует файл .ini, а некоторые другие части программного обеспечения используют файлы XML для хранения этой информации.

Один из этих подходов благословлен Гвидо и / или сообществом Python больше, чем другой?

Ответы [ 12 ]

29 голосов
/ 09 июня 2009

Как уже говорили многие, нет "официального" пути. Есть, однако, много вариантов. В этом году на PyCon был разговор о многих доступных вариантах.

29 голосов
/ 08 июня 2009

Зависит от преобладающей целевой аудитории.

Если программисты все равно изменяют файл, просто используйте файлы Python, такие как settings.py

Если это конечные пользователи, подумайте об INI-файлах.

14 голосов
/ 02 июня 2011

Я использую полку (http://docs.python.org/library/shelve.html):

shelf = shelve.open(filename)
shelf["users"] = ["David", "Abraham"]
shelf.sync() # Save
14 голосов
/ 08 июня 2009

Не знаю, можно ли это считать "официальным", но оно есть в стандартной библиотеке: 14.2. ConfigParser - анализатор конфигурационных файлов .

Очевидно, что не универсальное решение. Просто используйте то, что кажется наиболее подходящим для задачи, без какой-либо необходимой сложности (и - особенно - для полноты по Тьюрингу! Подумайте об автоматических или графических конфигураторах).

8 голосов
/ 08 июня 2009

Еще одна опция, PyQt. Qt имеет независимый от платформы способ хранения настроек с классом QSettings. Под капотом в Windows он использует реестр, а в Linux он сохраняет настройки в скрытом файле conf. QSettings работает очень хорошо и, кажется, совершенно не похоже.

6 голосов
/ 10 февраля 2017

Насколько я знаю, благословенного решения не существует. Не существует правильного или неправильного способа хранения настроек приложения: ни 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 голосов
/ 08 июня 2009

Я не уверен, что существует «официальный» способ (он не упоминается в Zen of Python :)) - я склонен использовать модуль Config Parser сам, и я думаю, что вы найдете это довольно распространенным. Я предпочитаю это по сравнению с файловым подходом python, потому что вы можете записать обратно и динамически перезагрузить, если хотите.

4 голосов
/ 08 июня 2009

Это во многом зависит от того, насколько сложна ваша конфигурация. Если вы делаете простое сопоставление ключ-значение и хотите, чтобы возможность редактировать настройки с помощью текстового редактора, я думаю, что ConfigParser - это то, что нужно.

Если ваши настройки сложны и включают списки и вложенные структуры данных, я бы использовал XML или JSON и создал бы редактор конфигурации.

Для действительно сложных вещей, когда конечный пользователь не должен сильно менять настройки или ему более доверяют, просто создайте набор классов Python и оцените скрипт Python для получения конфигурации.

2 голосов
/ 04 ноября 2017

Одним из самых простых способов использования является использование модуля 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')) ;
2 голосов
/ 27 мая 2013

Для веб-приложений мне нравится использовать переменные среды ОС: os.environ.get('CONFIG_OPTION')

Это особенно хорошо работает для настроек, которые различаются в зависимости от развертывания. Вы можете прочитать больше об обосновании использования env vars здесь: http://www.12factor.net/config

Конечно, это работает только для значений только для чтения, потому что изменения в среде обычно не постоянны. Но если вам не нужен доступ для записи, это очень хорошее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...