Подтвердить что ты не робот

Каков официальный способ сохранения настроек для программ python?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

Насколько я знаю, нет благословенного решения. Нет правильного или неправильного способа хранения настроек приложения, ни файлы 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 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 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 print 'my path' preference
    print newPref.get('my path')

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

почему Гвидо благословил что-то, что выходит за рамки его? Нет ничего особого благословения.

Ответ 11

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

Ответ 12

Это больше удобно. Официального способа говорить нельзя. Но использование XML файлов имело бы смысл, поскольку их можно было манипулировать различными другими приложениями/библиотеками.