Файл конфигурации Python: любая рекомендация формата файла? Формат INI все еще подходит? Кажется, довольно старая школа



Мне нужно хранить конфигурации (ключ / значение) для приложения Python, и я ищу лучший способ хранения этих конфигураций в файле.



я натыкаюсь на питона ConfigParser и я задался вопросом, действительно ли формат файла INI по-прежнему подходит в наши дни?!
Существует ли более современный формат или INI по-прежнему является рекомендуемым способом? (XML, JSON, ...)



пожалуйста, поделитесь своими мнениями / рекомендациями...

417   8  

8 ответов:

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

пример (example.conf):

# use normal python comments

value1 = 32
value2 = u"A unicode value"
value3 = "A plain string value"

value4 = ["lists", "are", "handy"]
value5 = {"and": "so", "are": "dictionaries"}

в вашей программе загрузите файл конфигурации с помощью execfile ( 2.7 docs):

if __name__ == "__main__":
    config = {}
    execfile("example.conf", config) 
    # python 3: exec(open("example.conf").read(), config)

    print config["value1"]
    print config["value5"]

мне нравится такой подход, по следующим причинам:

  • в простом случае формат так же легко создать, как и файл конфигурации в стиле INI. Он также имеет важную характеристику с INI-файлами: он очень подходит для версии управление (это менее верно для XML и, возможно, также для JSON)
  • мне нравится гибкость, которая приходит с наличием конфигурационного файла на реальном языке программирования.

данный подход широко используется, несколько примеров:

  • настройки сайта Django живет внутри settings.py. Django не использует execfile, он использует import читать/исполнение settings.py AFAIK, но конечный результат тот же: код внутри файла настроек выполненный.
  • оболочка bash читает и выполняет ~/.bashrc при запуске.
  • интерпретатор Python импортирует (и выполняет) site.py при запуске.

INI - это полностью нормально, и, как говорится, формат вашего файла конфигурации действительно зависит от того, как вы собираетесь его использовать.

лично я поклонник в YAML: лаконичный, четкий, гибкий.

Google, похоже, разделяет мой энтузиазм, поскольку они тоже используют его в движке приложений Google. Синтаксический анализатор python-это здесь.

словари довольно популярны. В основном хэш-таблица.

{"one": 1, "two": 2} это пример, вроде выглядит как json.

затем вы можете вызвать его как mydict["one"], что бы вернуть 1.

затем вы можете использовать shelve сохранить словарь в файл:

mydict = shelve.open(filename)
# then you can call it from there, like
mydict["one"]

Итак, это несколько проще, чем ini-файл. Вы можете добавить материал так же, как список или изменить параметры довольно легко, а затем, как только вы его закроете, он выпишу его обратно.

вот простой пример того, что я имею в виду:

import shelve

def main():
    mydict = shelve.open("testfile")
    mydict["newKey"] = value("some comment", 5)
    print(mydict["newKey"].value)
    print(mydict["newKey"].comment)
    mydict.close()


class value():
    def __init__(self, comment, value):
        self.comment = comment
        self.value = value



if __name__ == '__main__':
    main()

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

XML / JSON идеально подходит, если у вас есть иерархические структуры, а также вы хотите использовать более сложные методы (например: проверка XML-файлов, пространства имен и т. д.).

проверить ConfigObj, Это самый гладкий метод, который я нашел до сих пор, и определенно более гибкий, чем ConfigParser. Лично я не поклонник YAML, потому что его "гибкость" затрудняет использование таких инструментов, как Augeas.

Это зависит от того, как будет использоваться файл конфигурации.

одним из преимуществ INI-файлов является то, что они очень легко читаются и понятны. Гораздо проще сделать ошибку в файле JSON или XML, если вы редактируете конфигурацию вручную. PHP по-прежнему использует INI-файлы.

однако, если ваша конфигурация не предназначена для редактирования вручную, перейдите в любой формат, который вам нравится, потому что INI не самый простой для разбора.

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

from optparse import OptionParser
_o = OptionParser("%prog [options] configfiles...")
_o.add_option("--hostname", metavar="HOSTNAME", default="10.0.0.1")
_o.add_option("--username", metavar="USERNAME", default="admin")
_o.add_option("--password", metavar="PASSWORD", default="admin")

import shlex
def parse(filename, defaults):
    opt, args = _o.parse_args(shlex.split(open(filename).read()), defaults)
    return opt

if __name__ == "__main__":
    import sys
    values, args = _o.parse_args()
    for arg in args:
       values = parse(arg, values)
    values, args = _o.parse_args(values = values)
    for name in _o.defaults:
        print name, "=", getattr(values, name)

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

file1.ini:

--hostname 10.2.3.4
--password admin-sc

file2.ini:

--username "foo bar"
--password "special key"

затем вы можете запустить ./configtest.py file1.ini file2.ini --password other и полученные значения будут иметь имя хоста как 10.2.3.4 и имя пользователя как " foo bar "и пароль как"другое". Этот вариант для параметров конфигурации пригодится, если у вас уже есть определение optparse для параметров вашей программы - > просто повторно используйте его, и вы можете связать значения из командной строки со значениями из файла конфигурации и, возможно, некоторые глобальные настройки конфигурации.

в качестве стимула, ваши параметры конфигурации всегда задокументированы и неверно введенные параметры конфигурации появятся раньше, чем ошибка, так же, как вы можете использовать экземпляр optparse для предварительной проверки файла настроек по умолчанию (проверка схемы). Как недостаток, нет никаких комментариев, разрешенных в ini, и элементы конфигурации не легко субструктурны.Тем не менее ваш парсер по сути является однострочным.

я столкнулся с той же проблемой несколько раз. Мне нравится идея файлов python в качестве файлов настроек, это просто, элегантно и всем другим разработчикам python нравится. В то же время не очень убежден в идее execfile.

поэтому я пошел вперед и создал сходятся.

Он поддерживает некоторые дополнительные параметры, но в его сердце это простой модуль python в качестве файла настроек.

Это просто

  • создания default_settings.py, prod_settings.py
  • pip install converge
  • import settings

Comments

    Ничего не найдено.