Управление зависимостями и устройствами

06 февраля 2023
Управление зависимостями и устройствами

Сегодня разберёмся с консервативным подходом к управлению зависимостями, порулим сетевыми устройствами Mikrotik и погрузимся в историю создания CircuitPython для программирования микроконтроллеров. Приятного чтения!

Скучный Python — зависимости

В мае 2022 года разработчик из Калифорнии James Bennett рассказал свой подход к управлению зависимостями в статье «Boring Python: dependency management». В его представлении термин «скучный Python» это не характеристика языка, а набор рекомендаций по уменьшению количества багов, «нескучных сюрпризов». Полностью от них избавиться нереально. Можно лишь снизить их число, убрав потенциальные источники ошибок.

Во многом его советы сводятся к исключению экспериментов и использованию стандартного инструментария там, где это возможно. Штатная экосистема пакетов Python насчитывает три инструмента: setuptools, pip и venv. Они неспешно развивались более 10 лет и доказали свою надёжность. По мнению автора, не стоит пытаться искать и использовать альтернативы, поскольку в дальнейшем это станет источником проблем.

Если речь заходит о системе управления пакетами pip, то имеет смысл задуматься, как передавать туда имена устанавливаемых пакетов. Это может быть или список имён в командной строке или сформированный файл(ы) с требованиями. Второй вариант удобнее и помогает формированию переносимой среды.

Зависимости часто тянут за собой другие зависимости, явно не указанные в файле требований. Их еще называют «транзитивными» зависимостями. Разработчику стоит взять под контроль всё «дерево» зависимостей. Для этого существует пакет pip-tools. Помимо поддержания зависимостей в актуальном состоянии, он позволяет обеспечить предсказуемость и детерминированность сборки. Также не стоит забывать о безопасности — проверка хэша существенно уменьшит риск проникновения вредоносных пакетов в проект, что в последние месяцы особенно актуально.

Не пренебрегайте виртуальными средами, «virtual environments». Это гарантирует изоляцию интерпретатора Python и всех установленных пакетов. Таким образом можно иметь сразу несколько независимых друг от друга сред разработки. Всё это путь к максимально воспроизводимой и согласованной среде. Её будет легко перенести и развернуть на любой инфраструктуре.

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

Paramiko для MikroTik

Латвийская компания MikroTik хорошо известна всем сетевым инженерам. Устройства, разрабатываемые этой компанией, работают как дома и в небольших офисах, так и в крупных дата-центрах. Если говорить о маршрутизаторах, то они работают на операционной системе RouterOS. Поддерживается множество способов управления — от консольного доступа через SSH/Telnet до использования Webfig/WinBox. Разработчикам также доступен вариант управления через API. Это позволяет создавать кастомные приложения, способные собирать показания с сетевых устройств и управлять ими.

Сама MikroTik в качестве референса указывает возможность взаимодействия без сторонних библиотек. Но для простых задач подойдёт и инструмент Paramiko, представляющий собой имплементацию протокола SSHv2. После установки можно сразу накидать простой код, вроде такого:

 

import paramiko

# Подключимся к маршрутизатору
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("<IP-ADDRESS>", username="<USERNAME>", password="<PASSWORD>")

# Для примера выполним команду вывода IP-адреса
stdin, stdout, stderr = ssh.exec_command("/ip/address/print")

# Выведем результат
print(stdout.read().decode())

# Закроем SSH-соединение
ssh.close()

Заменяем <IP-ADDRESS>, <USERNAME> и <PASSWORD> на действительные значения и можно тестировать. Это лишь самый примитивный пример применения.

Сценарий использования в дата-центре может выглядеть следующим образом. Сетевое оборудование чаще всего учитывается в системе DCIM (Data center infrastructure management). Опытному разработчику ничего не стоит выгрузить реестр с оборудованием из DCIM, а затем выполнить выполнить нужные действия сразу на группе маршрутизаторов. Так, например, можно выполнить обновление программного обеспечения, бэкап или восстановление файлов конфигурации.

CircuitPython от Adafruit

Прошло 10 лет с того момента, как Эрнандо Барраган (Hernando Barragán) решил в качестве магистерской диссертации создать дешевую и простую среду для начального обучения программированию. Результатом стала платформа Wiring, форк которой мы знаем под названием Arduino.

С ростом популярности платформы Arduino стали появляться компании, разрабатывающие совместимые модули расширения. Эти модули значительно снижают порог входа в разработку, так как включают в себя всю необходимую обвязку. То есть пользователи не должны паять, а просто подключают модули и начинают программировать. Компании вроде Adafruit Industries предлагают сенсоры, дисплеи, драйверы для двигателей, а также другие модули расширения.

Разработка качественного железа стала одним из факторов успеха. Но без создания приложений и формирования экосистемы компания вряд ли бы достигла текущих показателей. Инженеры Adafruit пошли дальше и решили ещё упростить программирование микроконтроллеров, сделав ставку на внедрение Python. Проблема была лишь в том, что применяемые чипы обладали весьма скромными характеристиками. Это значило, что поддерживать все фичи языка было бы нереальной задачей.

Конечно, Adafruit не единственные, кому в голову пришла идея создать Python для микроконтроллеров. В 2013 году успешная краудфандинговая кампания австралийского разработчика Дэмиена Джорджа (Damien George) позволила создать такую версию, названную MicroPython. Adafruit решили не изобретать велосипед, а взять этот код за основу уже собственного продукта CircuitPython.

Из оригинала были удалены прерывания и многопоточность. Параллелизм поддерживается весьма условно. Async/await доступны лишь на некоторых платах, а для решения типовых задач, вроде воспроизведения музыки, были созданы отдельные программные модули. Чтобы в результате жесткого сбоя пользователь не получил «кирпич», был добавлен специальный безопасный режим, позволяющий пропустить запуск пользовательского кода. Если приложение вызвало сбой, плата остается доступной.

CircuitPython отлично задокументирован, поддерживает более 300 устройств и даёт возможность пробросить код на Python в «реальный мир». Если у вас завалялся поддерживаемый микроконтроллер без дела, то в него можно вдохнуть жизнь с помощью любимого языка программирования.

Митапы

Онлайн

Python meetup

29 марта 2023

 

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

Теперь следить за митапами Evrone стало удобнее. В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи после мероприятий. А ещё, у нас можно выступить, мы поможем оформить вашу экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.

Регистрация

Вакансии

Удаленка / Офис

Evrone 

Мы рады новым Python-разработчикам. Удалённая работа с первого дня, помощь в подготовке выступлений на профессиональных конференциях, поощрение и оплата участия в Open-source проектах. Прозрачный способ увеличить грейд через обучение и проверку навыков под контролем ментора. Здесь есть понимание как организовать разработку комфортно и эффективно. Присоединяйтесь!

Подробнее

Подписаться
на Digest →
Важные новости и мероприятия без спама
Технологии которыми вы владеете и которые вам интересны
Ваш адрес электронной почты в безопасности - вот наша политика конфиденциальности.