В стандартной библиотеке Python есть модули для синтаксического анализа файла конфигурации ( configparser ), чтения переменных среды ( os.environ ) и синтаксического анализа аргументов командной строки ( argparse ). Я хочу написать программу, которая сделает все это, а также:
Имеет каскад значений опций :
- значения параметров по умолчанию, замененные
- параметры файла конфигурации, переопределенные
- переменные среды, переопределенные
- параметры командной строки.
Разрешает одно или несколько расположений файлов конфигурации, указанных в командной строке с помощью, например
--config-file foo.conf
, и читает их (вместо или в дополнение к обычному файлу конфигурации). Это все еще должно подчиняться вышеуказанному каскаду.Позволяет определять параметры в одном месте для определения поведения синтаксического анализа файлов конфигурации и командной строки.
Объединяет проанализированные параметры в единую коллекцию значений параметров для доступа остальной части программы, не заботясь о том, откуда они взялись.
Все, что мне нужно, очевидно, есть в стандартной библиотеке Python, но они не работают вместе гладко.
Как я могу добиться этого с минимальным отклонением от стандартной библиотеки Python?
jterrace
назначил здесь награду, чтобы подтолкнуть меня к краю, достаточно, чтобы попробовать свои силы в чем-то подобном :)Ответы:
Модуль argparse делает это не сумасшедшим, если вы довольны конфигурационным файлом, который выглядит как командная строка. (Я думаю, что это преимущество, потому что пользователям нужно будет изучить только один синтаксис.) Установка fromfile_prefix_chars , например, на
@
, делает так, что,эквивалентно
если
@baz.conf
есть,Вы даже можете настроить
foo.conf
автоматический поиск кода , изменивargv
Формат этих файлов конфигурации можно изменить, создав подкласс ArgumentParser и добавив метод convert_arg_line_to_args .
источник
ОБНОВЛЕНИЕ: наконец-то я решил поставить это на pypi. Установите последнюю версию через:
Полная справка и инструкции здесь .
Исходный пост
Вот кое-что, что я вместе взломал. Не стесняйтесь предлагать улучшения / сообщения об ошибках в комментариях:
ДЕЛАТЬ
Эта реализация еще не завершена. Вот неполный список TODO:
argparse
обрабатываются сообщения об ошибкахСоответствовать документированному поведению
dest
изargs
вadd_argument
, вместо того , чтобы полагаться наAction
объектparse_args
функцию, которая используетparse_known_args
. (например, скопируйтеparse_args
изcpython
реализации, чтобы гарантировать ее вызовparse_known_args
.)Менее простые вещи…
Я еще ничего из этого не пробовал. Маловероятно - но все же возможно! - что это может сработать ...
section
в конфигурационном файле.)section
в файле конфигурации.)источник
pip install configargparser
Есть библиотека, которая делает именно это, под названием configglue .
Он также поддерживает переменные среды.
Есть еще одна библиотека под названием ConfigArgParse, которая
Возможно, вас заинтересует рассказ Лукаша Ланги о настройке PyCon - пусть они настроят !
источник
Хотя я не пробовал это самостоятельно, есть библиотека ConfigArgParse, в которой говорится, что она делает большинство вещей, которые вы хотите:
источник
Кажется , что стандартная библиотека не решает это, в результате чего каждый программиста булыжник
configparser
иargparse
иos.environ
все вместе в неуклюжих способах.источник
Насколько мне известно, стандартная библиотека Python этого не обеспечивает. Я решил это для себя, написав код для использования
optparse
иConfigParser
анализа командной строки и файлов конфигурации, а также предоставив поверх них слой абстракции. Однако вам понадобится это как отдельная зависимость, которая из вашего предыдущего комментария кажется неприятной.Если вы хотите взглянуть на написанный мною код, он находится на http://liw.fi/cliapp/ . Он интегрирован в мою библиотеку «каркаса приложений командной строки», так как это большая часть того, что нужно делать каркасу.
источник
Я недавно пробовал что-то подобное, используя optparse.
Я установил его как подкласс OptonParser с помощью команд --Store и --Check.
Приведенный ниже код в значительной степени должен вас охватить. Вам просто нужно определить свои собственные методы «загрузки» и «хранения», которые принимают / возвращают словари, и вы очень сильно настроены.
источник
Чтобы выполнить все эти требования, я бы порекомендовал написать вашу собственную библиотеку, которая использует как синтаксический анализ [opt | arg], так и configparser для базовой функциональности.
Учитывая первые два и последнее требование, я бы сказал, что вам нужно:
Шаг первый: выполните проход парсера командной строки, который ищет только параметр --config-file.
Шаг второй: проанализируйте файл конфигурации.
Шаг третий: настройте второй проход парсера командной строки, используя выходные данные прохода файла конфигурации по умолчанию.
Третье требование, вероятно, означает, что вы должны разработать свою собственную систему определения опций, чтобы раскрыть все функции optparse и configparser, которые вам нужны, и написать некоторую сантехнику для выполнения преобразований между ними.
источник
Вот модуль, который я собрал вместе, который считывает аргументы командной строки, параметры среды, файлы ini и значения связки ключей. Это также доступно в чистом виде .
источник
Вы можете использовать для этого ChainMap. Взгляните на мой пример, который я привел в статье «Как лучше всего разрешить переопределение параметров конфигурации в командной строке в Python?» ТАК вопрос.
источник
Созданная мною библиотека как раз отвечает большинству ваших потребностей.
Он может прикреплять параметры командной строки к некоторым командам щелчка
(извините, это не argparse, но щелчок лучше и намного более продвинутый.
confect
может поддерживать argparse в будущей версии).confect
загружает файлы конфигурации Python, а не JSON / YMAL / TOML / INI. Как и файл профиля IPython или файл настроек DJANGO, файл конфигурации Python является гибким и простым в обслуживании.Для получения дополнительной информации проверьте файл README.rst в репозитории проекта . Имейте в виду, что он поддерживает только Python3.6 и выше.
Примеры
Присоединение параметров командной строки
Он автоматически создает подробное справочное сообщение со всеми объявленными свойствами и значениями по умолчанию.
Загрузка переменных среды
Для загрузки переменных среды требуется всего одна строка
источник