Как создать environment на основе файла yaml

Обновлено: 05.07.2024

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

В Symfony идея “окружений” заключается в том, что одна и та же кодовая база может быть выполнена с использованием множества разных конфигураций. Например, окружение dev должно использовать конфигурацию, которая делает разработку лёгкой и дружественной, в то время, как окружение prod должно использовать набор конфигурации, оптимизированный для скорости.

Разные окружения, разные файлы конфигурации¶

Типичное приложение Symfony начинается с трёх окружений: dev , prod , и test . Как уже было сказано, каждое окружение представляет собой способ выполнять одну кодовую базу с разными конфигурациям. Поэтому не должно быть сюрпризом, что каждое окружение загружает свой собственные файлы конфигурации. Эти разные файлы упорядочены по окружению:

  • для окружения dev : config/packages/dev/
  • для окружения prod : config/packages/prod/
  • для окружения test : config/packages/test/

В действительности, каждое окружение лишь слегка отличается от других. Это означает, что все окружения имеют общую большую базу конфигураций. Эта конфигурация размещается в файлах напрямую в каталоге config/packages/ .

Расположение этих файлов определяется ядром приложения:

Возьмите пакет фреймворка, установленный по умолчанию, в качестве примера:

  • Загружается во всех окружениях, config/packages/framework.yaml конфигурирует фреймворк с некоторой установкой secret ;
  • В окружении prod не будет установлено ничего дополнительного, так как нет каталога config/packages/prod/ ;
  • То же самое применимо к dev, так как нет config/packages/dev/framework.yaml . Однако существуют другие пакеты (например, routing.yaml ) со спецальными настройками для dev;
  • Наконец, в окружении test, функции теста фреймворка включаются в config/packages/test/framework.yaml .

Выполнение приложения в разных окружениях¶

Чтобы выполнить приложение в каждом окружении, измените переменную окружения APP_ENV . Во время разработки это делается в .env :

В производстве рекомендуется конфигурировать переменные окружения в вашей конфигурации веб-сервера .

Данные URL предполагают, что ваш веб-сервер сконфигурирован так, чтобы использовать каталог приложение public/ в качестве корневого. Прочтите больше в Установке Symfony .

Если вы откроете файл, который вы только что посетили ( public/index.php ), то вы увидите, что переменная окружения передаётся ядру:

Вы также можете заменить $_SERVER['APP_ENV'] ?? 'dev' просто на 'dev' , чтобы всегда выполнять приложение в окружении разработки, независимо от переменной APP_ENV .

Окружение test используется при написании функциональных тестов и оно недоступно в браузере напрямую через фронт-контроллер.

Важным, но не имеющим отношения к теме окружений, является второй аргумент конструктора Kernel . Он указывает, должно ли приложеие работать в “режиме отладки”. Несмотря на окружение, приложение Symfony может быть запущено с режимом отладки, установленным как true или false ( 1 или 0 соответственно для переменной APP_DEBUG , определённой в .env ). Это влияет на многие вещи в приложении, такие как отображение трассы вызовов в стеке на страницах ошибки или на динамическую перестройку файлов кеша по каждому запросу. Хоть это и не является требованием, режим отладки обычно установлен как true для окружений dev и test , и как false для окружения prod .

Глубокое обучение-1. Создайте собственную среду глубокого обучения

Введение

Для многих студентов, которые только начинают заниматься машинным обучением или глубоким обучением, настройка среды является довольно головной болью не только из-за выбора Windows или Ubuntu, даже если выбор Python также очень запутан, будь то Python2, pyhon3 или pycharm. IDE с полным набором функций и удобной компиляцией и отладкой, или использование anocanda для создания jupyter notebook. Из-за слишком большого количества вариантов я страдаю фобией выбора и не знаю, какой из них мне подходит. Здесь я рекомендую вам выбрать pycharm. При загрузке и установке вы выберете версию Python. Python2 будет постепенно отказываться от обслуживания в будущем, поэтому я рекомендую Python3. Если вы хотите продолжить работу вручную в будущем Для умной связанной работы рекомендуется создать свою собственную среду на ubuntu, чтобы облегчить вашу собственную разработку. Конечно, анаконда также поддерживается в Windows, и также можно создать среду глубокого обучения. В этой статье в основном рассказывается, как создать собственную среду глубокого обучения (общая для машинного обучения) под Ubuntu.

Введение и установка Anaconda

ИспользоватьAnacondaДля управления пакетами и средой, используемыми Python. Anaconda позволяет легко устанавливать часто используемые пакеты в вашей работе с данными. Вы также будете использовать его для создания виртуальных сред, чтобы упростить работу с несколькими проектами. Anaconda упрощает рабочий процесс и решает большое количество проблем, возникающих между несколькими пакетами и версиями Python. Anaconda - это на самом деле выпуск программного обеспечения, он поставляется с conda , Python и более 150 научных пакетов и их зависимостей. применение conda Это менеджер пакетов и среды. Файл загрузки Anaconda относительно велик (около 500 МБ), потому что он поставляется с наиболее часто используемым пакетом Data Science в Python.

Процесс установки Anaconda

1.Официальный веб-сайтЗагрузите установочный пакет anaconda и выберите последнюю версию linux-> python3.7.

2. Выполните следующую команду для установки в путь, по которому находится файл.

3. Проверка прошла успешно.

пакет управления conda

Диспетчер пакетов conda используется для установки библиотек и другого программного обеспечения на компьютер. Возможно, вы уже знакомы pip , Это менеджер пакетов по умолчанию для библиотек Python. conda против pip Аналогично, разница в том, что доступные пакеты в основном представляют собой пакеты для анализа данных, и pip Подходит для общего пользования. в то же время, conda Не как pip Это особенно применимо к Python, он также может устанавливать пакеты, отличные от Python. Это менеджер пакетов, который поддерживает любое программное обеспечение. Другими словами, хотя не все библиотеки Python можно получить через дистрибутив Anaconda и conda, он также поддерживает приобретение библиотек, отличных от Python. При использовании conda вы все равно можете использовать pip Приходите устанавливать пакет.

установочный пакет conda

Пакет управления conda довольно прост. Чтобы установить пакет, введите " conda install package_name" . Например, чтобы установить numpy, введите:

conda установить несколько пакетов

пакет удаления conda

conda и новый пакет

Экологического менеджмента

Далее основное внимание уделяется тому, как создать собственную среду с помощью conda, вы можете использовать conda для создания среды для изоляции проекта.

Чтобы создать среду, используйте в терминале conda create -n env_name list of packages . это здесь, -n env_name Задайте имя среды ( -n Относится к имени), и list of packages Список пакетов для установки в среде. Например, чтобы создать my_env И установите в него numpy, введите:

При создании среды вы можете указать версию Python, которая будет установлена ​​в среде. Это полезно, когда вы одновременно используете код из Python 2.x и Python 3.x. Чтобы создать среду с определенной версией Python, введите что-нибудь вроде conda create -n py3 python=3 Или же conda create -n py2 python=2 Команда. Фактически, я создал эти две среды на своем персональном компьютере. Я использую их как среду общего назначения, которая не имеет ничего общего с каким-либо конкретным проектом для выполнения обычной работы (можно легко использовать любую версию Python). Эти команды установят последние версии Python 3 и Python 2 соответственно. Чтобы установить определенную версию (например, Python 3.7), используйте conda create -n py python=3.7 。

Войдите в окружающую среду

После входа в среду вы увидите имя среды в приглашении терминала, которое похоже на (my_env)

$ . В среде установлено лишь несколько пакетов по умолчанию, а также пакеты, которые вы установили при ее создании. вы можете использовать conda list Проверь это. Команда для установки пакета в окружение такая же, как и раньше: conda install package_name . Однако конкретный пакет, который вы установили на этот раз, будет доступен только после входа в среду.

Выйти из окружающей среды

Совместное использование окружающей среды

Функция общей среды действительно полезна: она позволяет другим устанавливать все пакеты, используемые в вашем коде, и обеспечивать правильность версий этих пакетов. вы можете использовать :

Среда хранения пакетов - это файл yaml. Первая часть команды conda env export Используется для вывода имен всех пакетов в среде (включая версию Python). Вторая часть команды экспорта > environment.yaml Запишите экспортированный текст в файл YAML environment.yaml В. Теперь к этому файлу можно предоставить общий доступ, и другие могут использовать его для создания той же среды, что и ваш проект.

Чтобы создать среду из файла среды, используйте:

Перечислите среду

Удалить среду

В приведенном выше контенте создана среда глубокого обучения, но нет специального инструмента для написания кода, компиляции и отладки. В настоящее время настало время для появления jupyter notebook.

Введение в блокнот jupyter

Блокнот Jupyter - это веб-приложение, которое позволяет пользователям объединять пояснительный текст, математические уравнения, код и визуальный контент в один удобный для совместного использования документ. Jupyter Notebook быстро стал важным инструментом для обработки данных. Его использование включаетОчистка и исследование данных, Визуализация, глубокое обучение иАнализ больших данных. Код, который вы пишете в веб-приложении, отправляется ядру через сервер, ядро ​​запускает код и отправляет результат обратно на сервер. После этого любой вывод будет возвращен в браузер. Когда вы сохраните записную книжку, она будет использоваться как файл JSON (расширение файла .ipynb ) Пишется на сервер.

установка ноутбука jupyter

Установите через conda в индивидуальной среде.

Запустить блокнот jupyter

1. Сначала войдите в среду глубокого обучения с помощью следующих команд:

2. Откройте блокнот jupyter.

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

Интеллектуальная рекомендация


WECHAT MILLY WAY POINT CAMENT CARD - СОВРЕМЕННЫЕ СТРАНИЦЫ ПРОГЛЯЮТНОЕ ЗНАЧЕНИЕ (Запрос)

WECHAT Small Pass Pass Value и значение приобретения: 1. Установите способ настройки идентификатора идентифицирует значение параметра, передаваемое после прыжка; 2, используя метод Data-XXXX для идент.


Текущая задача Узел больше экземпляров


[Linux] Программирование сетевых сокетов UDP

Что такое протокол UDP Протокол UDP называетсяПротокол пользовательских датаграмм UDP - протокол транспортного уровня Без установления соединения, ненадежная передача, ориентированная на дейтаграмму П.



Основная идея обработки больших данных - разделяй и властвуй

Разделяй и властвуй - «разделяй и властвуй» Как мы все знаем, компьютеры очень быстрые и используются людьми. Однако независимо от того, насколько быстрым является компьютер, способность о.

Мы все любим Ansible, но Ansible – это YAML. Для конфигурационных файлов существует масса форматов: списки значений, пары «параметр-значение», INI-файлы, YAML, JSON, XML и множество других. Однако по нескольким причинам из всех них YAML часто считается особенно трудным. В частности, несмотря на его освежающий минимализм и впечатляющие возможности для работы с иерархическими значениями, синтаксис YAML может раздражать своим Python-образными подходом к отступам.


Если вас бесит YAML, вы можете – и должны! – предпринять 10 следующих шагов, чтобы снизить свое раздражение до приемлемого уровня и полюбить YAML. Как и положено настоящему списку, наша десятка советов будет нумероваться с нуля, медитацию и духовные практики добавляем по желанию ;-)

0. Заставьте ваш редактор работать

Неважно, какой у вас текстовый редактор – для него наверняка существует хотя бы один плагин для работы с YAML. Если у вас такого нет, немедленно найдите и установите. Потраченное на поиск и настройку время будет многократно окупаться каждый раз, когда вам придется редактировать YAML.

Например, редактор Atom поддерживает YAML по умолчанию, а вот для GNU Emacs придется установить дополнительные пакеты, например, yaml-mode.


Emacs в режиме YAML и отображения пробелов.

Если в вашем любимом редакторе нет режима YAML, то часть проблем можно решить, поработав с настройками. Например, штатный для GNOME текстовый редактор Gedit не имеет режима YAML, но по умолчанию подсвечивает синтаксис YAML и позволяет настроить работу с отступами:


Настройка отступов в Gedit.

А плагин drawspaces для Gedit отображает пробелы в виде точек, устраняя неясности с уровнями отступа.

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

1. Используйте линтер (linter)

В идеале языки программирования и языки разметки используют предсказуемый синтаксис. Компьютеры хорошо справляются с предсказуемостью, поэтому еще в 1978 году возникла концепция линтера. Если за 40 лет своего существования она прошла мимо вас и вы до сих пор не пользуетесь YAML-линтером, то самое время попробовать yamllint.

Установить yamllint можно с помощью штатного менеджера пакетов Linux. Например, в Red Hat Enterprise Linux 8 или Fedora это делается так:


Затем вы просто запускаете yamllint, передавая ему YAML-файл для проверки. Вот как это выглядит, если передать линтеру файл с ошибкой:


Цифры слева – это не время, а координаты ошибки: номер строки и столбца. Описание ошибки может вам ни о чем не говорить, зато вы точно знаете, где она находится. Просто посмотрите на это место в коде, и, скорее всего, все станет ясно.

Когда yamllint не находит ошибок в файле, на экран ничего не выводится. Если вас пугает такая тишина и хочется немного больше обратной связи, то можно запускать линтер с условной командой echo через двойной амперсанд (&&), вот так:


В POSIX двойной амперсанд срабатывает тогда и только тогда, когда предшествующая команда возвращает 0. А yamllint как раз возвращает количество найденных ошибок, поэтому вся эта условная конструкция и работает.

2. Пишите на Python, а не на YAML

Если вас реально бесит YAML, просто не пишите на нем, в буквальном смысле. Бывает, что YAML – это единственный формат, который воспринимается приложением. Но и в этом случае необязательно создавать YAML-файл. Пишите на том, что вам нравится, а потом конвертируйте. Например, для Python есть отличная библиотека pyyaml и целых два способа конвертирования: самоконвертирование и конвертирование через скрипты.

Самоконвертирование

В этом случае файл с данными заодно является и Python-скриптом, который генерирует YAML. Этот способ лучше всего подходит для небольших наборов данных. Вы просто пишите JSON-данные в переменную Python, предваряете это директивой import, а в конце файла добавляете три строчки для реализации вывода.


Теперь запускаем это файл на Python-е и на выходе получаем файл output.yaml:

Конвертирование через скрипты

В этом случае сначала пишем на JSON-е, а затем запускаем конвертор в виде отдельного Python-скрипта, который на выходе дает YAML. По сравнению с предыдущим этот способ лучше масштабируется, поскольку конвертирование отделено данных.


Затем создадим простой скрипт-конвертор и сохраним его под именем json2yaml.py. Этот скрипт импортирует оба модуля — YAML и JSON Python, а также загружает указанный пользователем файл JSON, выполняет конвертирование и пишет данные в файл output.yaml.


Сохраните этот скрипт в system path и запускайте по мере необходимости:

3. Парсите много и часто

Иногда на проблему полезно взглянуть под другим углом. Если вам трудно представить взаимосвязи между данными в YAML, можно временно преобразовать их в нечто более привычное.

Например, если вам удобно работать со словарными списками или с JSON, то YAML можно преобразовать в JSON всего двумя командами в интерактивной оболочке Python. Допустим, у вас есть YAML-файл mydata.yaml, тогда вот как это будет выглядеть:


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

4. Читайте спеки

5. Псевдоконфиги

При написании книги или статьи всегда полезно сперва набросать предварительный план, хотя бы в виде оглавления. Так же и с YAML. Скорее всего, вы представляете, какие данные надо записать в файл YAML, но не очень понимаете, как связать их друг с другом. Поэтому прежде чем ваять YAML, нарисуйте псевдоконфиг.

Псевдоконфиг похож на псевдокод, где не надо заботиться о структуре или отступах, отношениях «родитель-потомок», наследовании и вложенности. Так и здесь: вы рисуете итерации данных по мере того, как они возникают у вас в голове.


Псевдоконфиг с перечислением программистов (Martin и Tabitha) и их навыков (языков программирования: Python, Perl, Pascal и Lisp, Fortran, Erlang, соответственно).

Нарисовав псевдоконфиг на листе бумаги, внимательно проанализируйте его и, если все в порядке, оформите в виде валидного YAML-файла.

6. Дилемма «табуляция или пробелы»

Вам придется решить дилемму «табуляция или пробелы?». Не в глобальном смысле, а лишь на уровне вашей организации, или хотя бы проекта. Неважно, будет ли при этом использоваться пост-обработка скриптом sed, настройка текстовых редакторов на машинах программистов или же поголовное взятие расписок о строгом соблюдении указаний линтера под угрозой увольнения, но все члены вашей команды, которые так или иначе касаются YAML, в обязательном порядке должны использовать только пробелы (как того требует спецификация YAML).

В любом нормальном текстовом редакторе можно настроить автозамену табуляции на заданное количество пробелов, поэтому бунта приверженцев клавиши Tab можно не бояться.

Как хорошо известно каждому ненавистнику YAML, на экране не видно разницы между табуляцией и пробелами. А когда чего-то не видно, об этом, как правило, вспоминают в последнюю очередь, после того, как перебрали, проверили и устранили все остальные возможные проблемы. Час времени, убитый на поиск кривой табуляции или блока пробелов, просто вопиет о том, что вам над срочно создать политику использования того или другого, а затем реализовать железобетонную проверку ее соблюдения (например, через Git-хук для принудительного прогона через линтер).

7. Лучше меньше да лучше (или больше – это меньше)

Некоторые люди любят писать на YAML, поскольку он подчеркивает структуру. При этом они активно используют отступы, чтобы выделять блоки данных. Это такое своего рода жульничество для имитации языков разметки, в которых используются явные разделители.

Вот пример такой структурированности из документации Ansible:


Кому-то такой вариант помогает разложить в голове структуру YAML, других он наоборот раздражает массой ненужных, на их взгляд, отступов.

Но если вы являетесь владельцем YAML-документа и отвечаете за его сопровождение, то вы и только вы должны определять, как использовать отступы. Если вас раздражают большие отступы, сведите их к минимуму, который только возможен согласно спецификации YAML. Например, вышеприведенный файл из документации Ansible без каких бы то ни было потерь можно переписать вот так:

8. Используйте заготовки

Если при заполнении файла YAML вы постоянно повторяете одни и те же ошибки, имеет смысл вставить в него шаблон-заготовку в виде комментария. Тогда в следующий раз можно будет просто скопировать эту заготовку и вписать туда реальные данные, например:

9. Используйте что-то другое

Если приложение не держит вас мертвой хваткой, то, возможно, стоит сменить YAML на другой формат. Со временем конфигурационные файлы могут перерастать себя и тогда лучше преобразовать их в простые скрипты на Lua или Python.

YAML – отличная штука, которую многие любят за минимализм и простоту, но это далеко не единственный инструмент в вашем арсенале. Так что иногда от него можно отказаться. Для YAML легко найти библиотеки парсинга, поэтому, если вы предложите удобные варианты миграции, ваши пользователи относительно безболезненно переживут такой отказ.

Если же без YAML никак не обойтись, то возьмите на вооружение эти 10 советов и победите свою неприязнь к YAML раз и навсегда!


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

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

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

Правильная реализация управления конфигурацией по сути должна позволять запускать программное обеспечение в любой среде без внесения изменений в его исходный код. Этот подход обеспечивает эффективное управление проблемными настройками вашего приложения со стороны администраторов Ops, обеспечивает представление информации о том, что может произойти во время его функционирования, а также позволяет изменять его поведение во время выполнения.

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

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

Когда необходим файл конфигурации приложения?

Перед разработкой конфигурационного файла сначала необходимо спросить себя, нужен ли вообще какой-либо внешний файл с данными? Разве мы не можем просто поместить их в виде константных значений прямо в исходном коде? Собственно, достаточно известная концепция The Twelve-Factor App давно отвечает на этот вопрос:

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

Обратите внимание, что это определение config не включает внутреннюю конфигурацию приложения, такую как, например, как config/routes.rb в Rails, или способ подключения модулей в Spring. Перечисленные выше примеры способов конфигурации не меняются в зависимости от среды развертывания, и поэтому это лучше всего реализовать их в коде.

Подходы рекомендованные этой концепцией предписывают, чтобы любые параметры, зависящие от среды, такие как учетные данные базы данных, находились во внешнем файле. В противном случае их реализуют просто обычными константами в коде. Другой вариант использования, который я часто вижу, – это хранение динамических переменных (данных) во внешнем файле (базе данных), например, черный blacklist или белый whitelist список пользователей. Ими могут быть числа в заданном диапазоне (например, длительность тайм-аута) или любые текстовые файлы с произвольным содержимым. Отметим, что эти динамические переменные (данные) остаются неизменными вне зависимости от особенностей исполняемой среды.

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

Какой формат файла конфигурации использовать?

С практической точки зрения, на формат файла конфигурации нет никаких технических ограничений, если код приложения может его прочитать и анализировать. Но есть и более рациональные практики для выбора формата файла с настройками. Так наиболее распространенными, стандартизованными форматами являются YAML, JSON, TOML и INI. Самый подходящий формата для файл конфигурации должен соответствовать как минимум трем критериям:

  1. Быть легко читаемым и редактируемым: файл должен иметь текстовый формат и такую структуру, чтобы его содержимое было легко понятно даже не разработчику.
  2. Разрешать использование комментариев: файл конфигурации – это то, что могут читать не только разработчики. Поэтому в процессе эксплуатации приложения чрезвычайно важно когда пользователи могут успешно пытаться понять его работу и изменить его поведение. Написание комментариев – это эффективный способ быстро пояснить ключевые особенности настройки приложения и делает конфигурационный файл более выразительным.
  3. Простота развертывания: файл конфигурации должен понятен для обработки всеми операционными системами и средами. Он также должен легко доставляться на сервер с помощью конвейера pipeline CDaaS.

Возможно вам пока не ясно какой из форматов файла лучше использовать. Но если вы подумаете об этом в контексте программирования на языке Python, то наиболее очевидным ответом будет YAML или INI. Форматы YAML и INI хорошо понятны большинству программ и пакетов Python.

INI файл, вероятно, является наиболее простым решением для сохранения настроек приложения, имеющих только один уровень иерархии (вложенности) параметров. Однако формат INI не поддерживает других типов данных, кроме строк: в нем все данные имеют строковое представление.

Та же конфигурация настроек в YAML выглядит следующим образом.

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

Формат файлов JSON по сути очень похож на YAML и тоже чрезвычайно популярен, однако в JSON файлы нельзя добавлять комментарии. JSON, как текстовый формат содержащий структурированные данные, часто используется для хранения внутренней конфигурации внутри программы, но совершенно не предназначен для того, чтобы делиться конфигурацией приложения с другими людьми (в особенности с далекими от вопросов разработки ПО).

Формат TOML, с другой стороны, похож на INI, но поддерживает гораздо больше типов данных, а также специальный синтаксис для хранения вложенных структур. Его часто используют менеджеры пакетов Python такие, например, pip или poetry. Но если в файле конфигурации присутствует слишком много вложенных структур, то YAML в этом отношении, с моей точки зрения, наилучший выбор. Следующий ниже фрагмент файла выглядит как INI, но в отличие от него каждое строковое значение имеет кавычки.

Пока что мы выяснили ЧТО из себя представляют форматы файлов YAML, JSON, TOML и INI, далее мы рассмотрим КАК они могут быть использованы.

Как обычно, мы начнем с самого простого, то есть создадим внешний файл с настройками, а затем прочитаем его. Python имеет в своем составе встроенные пакеты для чтения и анализа файлов YAML и JSON. И как видно из приведенного ниже кода, они фактически возвращают один и тот же объект типа dict, поэтому доступ к его атрибутам будет одинаковым для обоих файлов.

Чтение

Из-за проблем с безопасностью рекомендуется использовать метод yaml.safe_load() вместо yaml.load() , чтобы избежать внедрения вредоносного кода при чтении файла конфигурации.

Валидация

При использовании обоих пакетов при попытке чтения несуществующего файла будет генерироваться исключение типа FileNotFoundError . Использование пакета для чтения файлов YAML позволяет получать разные исключения для следующих случаев: пользователь указал файл не являющимся YAML файлом, а также прочитанный файл YAML является не корректным, то есть содержит синтаксические ошибки. В свою очередь пакет для чтения JSON файлов генерирует единственное исключение типа JSONDecoderError для обоих рассмотренных случаев.

Пакет Cofigureparser из состава стандартной библиотеки Python

В этом разделе рассмотрим пакеты, предназначенные непосредственно для управления конфигурацией приложения. И начнем со встроенного в стандартную библиотеку Python пакета: Configureparser.

Configureparser в большинстве случаев используется для чтения и записи INI файлов, и поддерживает чтение входных данных из файла сразу в виде словаря или итерируемого iterable файлоподобного объекта. Как известно, каждый файл INI состоит из нескольких секций, содержащих настройки в виде пар ключ-значение. Ниже приведен простой пример кода для доступа к полям настроек.

Чтение

Как уже нами упоминалось ранее, Configureparser может читать данные настроек в следующих видах на выходе: словаря с помощью метода read_dict() , простой строки с использованием read_string() и итерируемого файлоподобного объекта, возвращаемого методом read_file() .

Валидация

Валидация данных с Configureparser не так проста, как для пакетов, работающих с форматами YAML и JSON. Во-первых, он не возбуждает исключения FileNotFoundError если файла настроек не существует, а вместо этого вызывает исключение типа KeyError, как при попытке доступа к отсутствующему ключу.

Кроме того, этот пакет «игнорирует» некоторые ошибки форматирования, например, неправильное использование отступа. Так в приведенном ниже примере, в случае если в файле присутствует дополнительная табуляция или пробел перед настройкой DEBUG , то вы получите неправильные значения для обеих настроек ENVIRONMENT и DEBUG .

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

Теперь перейдем к сторонним библиотекам, использующимся для управления конфигурацией приложений Python. До сих пор я намеренно пропустил еще один тип файлов конфигурации, а именно .env . Так значения настроек, находящихся в файле .env при запуске терминала (скрипта приложения) будут загружены как переменные среды, и поэтому с помощью библиотеки python-dotenv , а точнее ее метода os.getenv() можно получить доступ к ним из кода приложения.

Файл .env обычно выглядит следующим образом. По умолчанию его местонахождение – корневая папка вашего проекта.

Чтение

Этот тип файла конфигурации очень легко использовать. Так если вы решите переопределить существующую (или создать новую) переменную среды, то можете использовать вызов метод load_dotenv() , например, зададим значение параметра override .

Валидация

Тем не менее пакет python-dotenv не проверяет корректность .env файла. Допустим у вас есть некоторый .env файл (его содержимое представлено ниже), и вы хотите получить доступ к значению переменной (параметра настройки) DEBUG , то будет возвращено значение None без возбуждения исключения соответствующего типа.

Чтение

Dynaconf использует .env файл для поиска других конфигурационных файлов и последующего заполнения полей settings объекта с настройками. Так если в двух файлах настроек есть одна и та же переменная, то ее значение будет перезаписано значением из последнего файла настроек.

Валидация

Одна из наиболее интересных, в частности для меня, возможностей dynaconf – это его настраиваемый валидатор. Как упоминалось ранее, Configureparser недостаточно строго проверяет корректность INI файлов настроек, но это можно легко реализовать в dynaconf. В следующем примере мы проверяем, существуют ли определенные ключи в файле с настройками и имеется ли в нем конкретный ключ с корректным значением. Если вы читаете настройки из файла YAML или TOML, которые как мы говорили ранее, поддерживают несколько типов данных, то вы даже можете проверить, находится ли значение настройки, например, число в заданном диапазоне.

Интеграция с Pytest

Еще одна интересная особенность dynaconf – это возможность его интеграции с pytest. Так настройки для модульного тестирования unit testing обычно существенно отличаются в различных средах. Для этого вы можете использовать параметр FORCE_ENV_FOR_DYNACONF , чтобы ваше приложение могло прочитать значения настроек из внешнего файла, или использовать фикстуру monkeypatch для замены определенных пар ключ и значение в файле настроек.

Обновляем конфигурацию приложения во время его выполнения

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

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

Hydra – это платформа, разработанная Facebook для гибкой и элегантной настройки самых сложных приложений. Которая помимо чтения, записи и валидации корректности файлов конфигурации, реализовывает свою достаточно рациональную стратегию упрощения управления несколькими конфигурационными файлами, переопределения (перезаписи) их с использованием интерфейса командной строки, создания snapshot снимка состояния приложения перед каждым его запуском (между перезапусками) и т.д.

Чтение

Рассмотрим основы использования hydra. Так в следующем примере команда +APP.NAME , добавленная в командную строку при запуске скрипта, позволяет добавить новое поле (настройку) в конфигурацию приложения, а также осуществить перезапись значения существующего поля (значения настройки) APP.NAME=hydra1.1 .

Валидация

Hydra прекрасно интегрируется с декоратором @dataclass для выполнения основных проверок корректности, таких как проверка типов или значения полей. Однако у нее нет поддержки __post_init__ метода расширенной проверки значений, как это описано в моей предыдущей статье.

Группа конфигураций

Hydra вводит концепцию под названием config group . Идея которой состоит в том, чтобы сгруппировать файлы конфигурации одного типа (или для выполнения одних задач) и затем выбирать один из них во время выполнения приложения. Например, у вас имеется группа настроек «Базы данных» с одной конфигурацией для Postgres, а другой для MySQL.

Когда конфигурация приложения станет более сложной, то в вашей программе она может иметь следующую структуру (пример из документации Hydra).

Например, вы хотите протестировать свое приложение с различными комбинациями опций db , schema и ui , это можно сделать следующим образом:

Далее…

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

В этом случае в основном потоке запускаются 6 задач одновременно:

Вывод

В этой статье мы рассмотрели несколько способов управления конфигурацией приложений в Python. Независимо от того какой из них вы выберете, всегда необходимо думать о удобочитаемости файлов конфигурации, дальнейшей их поддержки, а также способах обнаружения ошибок для случаев их некорректного использования. Таким образом, конфигурационный файл – это по сути еще один тип кода.

Надеюсь, вам понравится эта статья, не стесняйтесь оставлять свои комментарии ниже.

Руководство для начинающих YAML

Изучение

YAML — это не язык разметки или сокращенно YAML — это язык сериализации данных, обычно используемый в файлах конфигурации, таких как Kubernetes, Docker, Ansible и многих других. Его популярность росла с годами, что сделало его своего рода конкурентом JSON.

Хорошо, если YAML не является языком разметки, что это такое?

Как уже упоминалось, YAML — это язык сериализации данных, разработанный для улучшения удобочитаемости за счет использования отступов и собственных структур данных. Думайте об этом как о строгом надмножестве JSON или как о помесье JSON и XML. Этот гибрид позволяет ему делать то, что может JSON, и другие дополнительные функции.

Цель этого руководства — познакомить вас с YAML, дать вам руководство по синтаксису языка, предоставить вам быстрые инструменты для работы с YAML и научить использовать его для файлов конфигурации и многое другое.

Как написать YAML

Написание YAML невероятно интуитивно понятно (я думаю, в этом суть), поскольку он использует синтаксис пары ключ-значение. Таким образом, это похоже на словарь в Python. Однако, в отличие от Python, YAML не позволяет использовать интервалы табуляции; он использует пробелы.

Чтобы начать новый документ YAML, мы начинаем с трех тире, обозначающих начало нового файла.

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

Создайте файл с расширением.YAML и добавьте следующее содержимое.

Как видно из приведенного выше файла, каждый документ в yaml начинается с трех точек, за которыми следуют данные, хранящиеся в парах ключ-значение.

Установите YAML linter

Прежде чем продолжить, давайте подтвердим, что у нас есть действующий файл YAML. Для этого нам необходимо установить линтер YAML.

Линтер — это инструмент, который проверяет и уведомляет разработчика об ошибках программирования, таких как синтаксические ошибки и недопустимые конструкции. Например, он позволяет вам проверить допустимый синтаксис файла.

В нашем примере мы будем использовать yamllint.

Для установки используйте apt как:

sudo apt-get update

sudo apt-get install yamllint -y

После установки мы можем запустить линтер для файла с помощью команды

echo -e ‘this is a valid : YAML syntax’ | yamllint sample.yaml

Если файл содержит допустимый синтаксис YAML, он не дает нам никаких результатов.

Теперь попробуйте добавить пробелы внутри файла YAML или добавить один дефис внизу как:

Если мы запустим линтер для этого файла, появятся ошибки, как показано ниже:

ПРИМЕЧАНИЕ. Подобно словарям в Python и аналогичным структурам данных в различных языках программирования, пары ключ-значение в документе YAML должны быть уникальными.

Типы данных YAML

YAML поддерживает различные способы представления данных. Они включают:

Это наиболее распространенный тип данных в YAML. Они представлены в виде пар «ключ-значение», как показано в примере выше.

Значения в паре могут быть любого типа, например строки, числа, включая шестнадцатеричные, целые числа и т. Д.

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

Ниже приведены примеры действительных строк в YAML.

ПРИМЕЧАНИЕ. Не забудьте закрыть двойные или одинарные кавычки, если они используются. Следующее приведет к ошибке.

Чтобы добавить абзац в файл YAML, используйте знак (больше). Не забудьте добавить пробел перед строкой. Например:

Другой тип данных, поддерживаемый в YAML, — это числовые типы. Числовые типы включают целые, десятичные, шестнадцатеричные, восьмеричные и другие числовые типы.

Следующий синтаксис YAML представляет числовые типы.

Списки в YAML указываются одним тире как:

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

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

мы устанавливаем null в YAML, используя тильду (

) или строку null, как показано в примере ниже:

Массивы в YAML указываются в квадратных скобках в одной строке. В следующем примере показано определение массивов в YAML.

Комментарии YAML

YAML также поддерживает комментарии, которые позволяют добавлять дополнительную информацию к данным YAML. Парсер игнорирует комментарии.

Преобразование YAML в JSON

В некоторых случаях нам может потребоваться преобразовать YAML в JSON. Поскольку они тесно связаны между собой, имеет смысл использовать одно в другом.

Для таких сценариев мы можем использовать такой инструмент, как yq, который представляет собой синтаксический анализатор YAML / XML для jq.

Чтобы установить его, используйте pip с командой, как показано ниже:

ПРИМЕЧАНИЕ. Убедитесь, что у вас установлен jq, поскольку это обязательная зависимость для yq.

Предположим, у нас есть образец файла для создания пода Kubernetes (Kubernetes.yaml) с таким содержимым, как показано:

ПРИМЕЧАНИЕ. Приведенный выше файл предназначен для иллюстрации и может содержать ошибки при использовании в реальном экземпляре Kubernetes.

Чтобы преобразовать файл YAML в JSON, используйте команду:

После выполнения приведенной выше команды содержимое файла автоматически преобразуется в JSON, как показано ниже:

Это упрощает работу при переходе с JSON на YAML и наоборот.

Заключение

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

Читайте также: