Конфигурационный файл 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 нет комментариев, и элементы конфигурации нелегко подструктурированы. Пока ваш синтаксический анализатор по существу является однострочным.