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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

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


В мире есть много прекрасных разработчиков, которые могут выдавать эффектные алгоритмы, изящные архитектуры и прекрасный код. Но эти же программеры берут и пишут весьма посредственно организованный код какого-нибудь маленького консольного скрипта для рассчета аналитики или патча данных в базе. Никакой разбивки на классы и функции, корявая передача аргументов, примитивный вывод малопонятной информации с помощью 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/


Интересные статьи

Интересные статьи

SWAP (своп) — это механизм виртуальной памяти, при котором часть данных из оперативной памяти (ОЗУ) перемещается на хранение на HDD (жёсткий диск), SSD (твёрдотельный накоп...
«Внедряем CRM? Ну ясно, мы под колпаком, теперь только контроль и отчёты», — примерно так рассуждает большинство сотрудников компаний, услышав о том, что скоро работа переместится в CRM. Считаетс...
Среди советов по улучшению юзабилити интернет-магазина, которые можно встретить в инете, один из явных лидеров — совет «сообщайте посетителю стоимость доставки как можно раньше».
О библиотеке LottieFiles многие знают, но пробовать на практике не спешат. Статей на эту тему мало, поэтому я решила поделиться своим опытом создания анимации для мобильных приложений с помощью L...
200 байт для управления состоянием React-компонентов React-хуки: это все, что нужно для управления состоянием. ~200 байт, min+gz. Знакомый API: просто пользуйтесь React, как обычно. Минимал...