- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток всем.
На сегодняшний день Python является одним из наиболее используемых языков в сфере создания не только непосредственно программных продуктов, но также обеспечения их инфраструктуры. Вследствие этого многим девопсам, по их воле или против оной, пришлось учить новый язык для последующего использования в качестве дополнения к старым добрым Bash-скриптам. Однако Bash и Python исповедуют различные подходы к написанию кода и имеют определенные особенности, в виду чего портирование Bash-скриптов на «змеиный язык» иногда оказывается ёмкой и далеко не тривиальной задачей.
Чтобы упростить жизнь девопсам, создано и продолжает создаваться много полезных библиотек и утилит на Python. Данная статья описывает сразу две новых библиотеки, созданные автором сего поста — smart-env [1] и python-shell [2] — и призванные избавить девопса от необходимости уделять много внимания тонкостям работы с Python, оставляя простор для более интересных задач. Сфера деятельности библиотек — переменные окружения и запуск внешних утилит.
Кого заинтересовало, прошу под кат.
Казалось бы, зачем создавать новые пакеты для достаточно обыденных операций? Что мешает использовать напрямую os.environ и subprocess.<метод или класс на ваш вкус>?
Доказательства в пользу каждой из библиотек приведу отдельно.
Перед тем, как писать собственное детище, полезно полезть в Интернет и поискать готовые решения. Конечно, есть риск не найти то, что нужно, но это, скорее, «страховой случай». Как правило, подход срабатывает и экономит кучу времени и сил.
По результатам поиска [3] было выявлено следующее:
get_<typename>(var_name)
Или вот еще одно решение [5], которое, однако, не поддерживает ныне опальный Python 2 (на котором, несмотря на официальный R.I.P. [6], все еще остаются горы написанного кода и целые экосистемы);
И этот список можно продолжать долго. Однако и приведенных выше пунктов хватило, чтобы загореться идеей сделать нечто удобное и универсальное.
Требования, которые ставились перед написанием smart-env:
В конечном итоге, все это удалось реализовать. Вот пример использования:
from smart_env import ENV
print(ENV.HOME) # Equals print(os.environ['HOME'])
# assuming you set env variable MYVAR to "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Equals boolean True
ENV.NEW_VAR = 100 # Sets a new environment variable
Как видно из примера, для работы с новым классом достаточно его импортировать (создавать экземпляр не нужно — минус лишнее действие). Доступ к любой переменной окружения достигается путем обращения к ней как к переменной класса ENV, что, фактически, делает этот класс интуитивно понятной обёрткой нативного системного окружения, параллельно превращая его в возможный вариант объекта конфигурации практически любой системы (похожий подход, например, достигается в Django, только там конфигурационным объектом выступает непосредственно модуль/пакет settings).
Включение/выключение режима поддержки автоматической типизации достигается использованием двух методов — enable_automatic_type_cast() и disable_automatic_type_cast(). Это может быть удобно, если в переменной окружения лежит сериализованный JSON-подобный объект или даже просто булевая константа (явное прописывание переменной DEBUG в Django путем сравнения переменной окружения с «допустимыми» строками — один из часто встречающихся случаев). Но теперь нет нужды явно конвертировать строки — большая часть необходимых действий уже заложена в недрах библиотеки и только ждет сигнала к действию. :) В целом же типизация работает прозрачно и поддерживает почти все имеющиеся встроенные типы данных (не тестировались frozenset, complex и bytes).
Требование поддержки Python 2 было реализовано практически без жертв (отказ от typing и некоторых «сахарных конфеток» последних версий Python 3), в частности, благодаря вездесущему six (для решения проблем использования метаклассов).
Но есть и немного ограничений:
Библиотека также исповедует механизм исключений на случай ошибок парсинга. Если строку не удалось распознать ни одним из имеющихся анализаторов, значение остается строковым (скорее, из соображений удобства и обратной совместимости с привычной логикой работы переменных в Bash).
Теперь расскажу о второй библиотеке (описание недостатков имеющихся аналогов опущу — оно похоже на описанное для smart-env. Аналоги — тут [8] и тут [9]).
В целом, идея реализации и требования к ней аналогичны описанным для smart-env, что видно из примера:
from python_shell import Shell
Shell.ls('-l', '$HOME') # Equals "ls -l $HOME"
command = Shell.whoami() # Equals "whoami"
print(command.output) # prints your current user name
print(command.command) # prints "whoami"
print(command.return_code) # prints "0"
print(command.arguments) # prints ""
Shell.mkdir('-p', '/tmp/new_folder') # makes a new folder
Идея такова:
Как и в случае со smart-env, обеспечена поддержка Python 2 (правда, жертвенной крови потребовалось немного больше) и отсутствует поддержка Python 3.0-3.4.
Использовать библиотеки можно уже сейчас: обе выложены на официальный PyPI. Исходники доступны на Github (см. ниже).
Обе библиотеки будут развиваться с учетом фидбека, собранного от заинтересовавшихся. И, если в smart-env, может, и сложно придумать разнообразие новых фич, то в python-shell точно есть еще что добавить:
UPD 23.02.2020:
* Репозитории перенесены, соответствующие ссылки обновлены
* Версия python-shell==1.0.1 готовится к выходу 29.02.2020. Среди изменений — поддержка автокомплита команд и команды dir(Shell), запуск команд с Python-невалидным идентификатором, исправление багов.
Автор: Alex Sokolov
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/347516
Ссылки в тексте:
[1] smart-env: https://pypi.org/project/smart-env/
[2] python-shell: https://pypi.org/project/python-shell/
[3] поиска: https://pypi.org/search/?q=env
[4] добавить типизацию: https://pypi.org/project/python-env-utils/
[5] еще одно решение: https://pypi.org/project/environs/
[6] официальный R.I.P.: https://pythonclock.org/
[7] тут: https://bugs.python.org/issue10091
[8] тут: https://pypi.org/search/?q=shell
[9] тут: https://pypi.org/search/?q=bash&o=
[10] Github: https://github.com/bart-tools/smart-env
[11] Github: https://github.com/bart-tools/python-shell
[12] Телеграм-канал: http://t.me/bart_tools
[13] Источник: https://habr.com/ru/post/489622/?utm_source=habrahabr&utm_medium=rss&utm_campaign=489622
Нажмите здесь для печати.