Мелкая питонячая радость #9: консольные приложения с человеческим лицом

от автора

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

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

Сегодня мы поговорим о том, как сделать лучше программы, на которые большинству плевать — одноразовые консольные утилитки и скрипты.

image

python-nubia

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

image

  • Автокомплит для функций, доступных в вашем консольном скрипте.
  • Можно подключать автокомплит на уровне терминала (работает в bash и zsh).
  • Приятный и красивый статус бар, который покажет пользователю, что же происходит.
  • Подсказки и валидации по наборам аргументов функций и их типам.

Termgraph

С выводом информации в консоль у многих вообще беда. Как говорилось выше, дело часто сводится к простому выводу print(). Читать такое, конечно, не очень удобно.

Для того, чтобы сделать отрисовку того, что происходит в программе, есть либа Termgraph

Она позволяет делать такие вот картинки в терминале

Или такие, посложнее

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

Fabric

Скрипты для выполнения на удаленных машинах — отдельная боль. Конечно, мы живем в веке DevOps, когда кучи задач решаются с помощью Salt и Ansible. Но бывает и такое, что нужно регулярно логиниться на кластер удаленных тачек и выполнять там пачки команд. Для этого и есть fabric

  • Поддержка разных списков хостов — можно выполнять команды на серверах БД, в кластере приложения — просто пропишите удаленные тачки в скрипт.
  • Разные политики авторизции для тачек — можно юзать и ключи, и пароли.
  • Разбивка скрипта на подкоманды, группировка подкоманд в команды побольше — можно делать сколь угодно сложную логическую структуру кода, который вы хотите запускать.
  • И, конечно же, можно мешать в коде команды терминала и питонячий код!

Fabric построен вокруг Paramiko и вообще вы можете выполнять команды с помощтю этой низкоуровневой библиотеки общения по SSH. Но Fabric дает необходимый уровень абстракции, который позволяет делать понятным и легкоиспользуемым.

python-prompt-toolkit

Эта либа превращает простой скрипт в реально мощное консольное приложение.

Например, можно добавить строку запроса команд в текстовый интерфейс.

from prompt_toolkit import prompt  while 1:     user_input = prompt('>')     print(user_input)

А после этого можно добавить историю использованных команд, прямо как в вашем терминале.

 from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory  while 1:     user_input = prompt('>',                          history=FileHistory('history.txt'),                        )     print(user_input)

А можно сделать автоподсказки строк из истории ввода.

 from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory  while 1:     user_input = prompt('>',                          history=FileHistory('history.txt'),                         auto_suggest=AutoSuggestFromHistory(),                        )     print(user_input) 

И научить автоподсказки определенным предустановленным командам.

 from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.contrib.completers import WordCompleter  SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'],                              ignore_case=True)  while 1:     user_input = prompt('SQL>',                          history=FileHistory('history.txt'),                         auto_suggest=AutoSuggestFromHistory(),                         completer=SQLCompleter,                         )     print(user_input) 

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

Зачем это?

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


ссылка на оригинал статьи https://habr.com/ru/post/463725/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *