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

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

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

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

Ответ 1

Рассмотрите возможность использования простых файлов 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 документов):

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 при запуске.

Ответ 2

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

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

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

Ответ 3

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

{"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()

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Для полноты вы также можете использовать формат конфигурации в стиле оболочки с помощью модуля "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" и пароль как "other". Это изменение параметров конфигурации может оказаться полезным, если у вас уже есть определение optparse для параметров вашей программы → просто повторно используйте его, и вы можете связать значения из командной строки со значениями из файла конфигурации и, возможно, с некоторыми глобальными настройками конфигурации.

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