Как написать консольное приложение на python
Из множества существующих языков программирования Python — один из самых лёгких в изучении. Он создан в конце 80-х годов XX века, но с тех пор он сильно изменился. Хотя Python входит в состав большинства дистрибутивов Linux, на него часто не обращают внимания при выборе языка для изучения. В этой статье мы рассмотрим создание консольных приложений, а в следующей — программирование графических интерфейсов (GUI ). Давайте создадим простую программу прямо сейчас.
Наша первая программа
Наберём код в текстовом редакторе (например, в gedit). Потом мы разберёмся, что делает каждая строка и пойдём дальше.
Введите эти 4 строки:
Это всё. Сохраните файл как hello.py в любом месте. Я предлагаю сохранить его в папке python_examples в домашнем каталоге. Этот пример показывает, как просто написать программу на Python. Для запуска программы нужно сделать её файл исполняемым. Для этого введите в терминале
в папке, в которой вы сохранили программу. Теперь запустите её.
Вот и всё. Теперь давайте рассмотрим что делает каждая строка программы.
Эта строка сообщает системе, что для запуска программы необходимо использовать интерпретатор Python версии 3.
Эта строка просто печатает в окне терминала Hello. I am a python program.
Эта строка немного сложнее. В ней две части. Первая часть: name = и вторая часть: input("What is your name? "). Сначала рассмотрим вторую часть. Команда input печатает вопрос в терминале («What is your name? ») и ожидает, пока пользователь (вы) не напечатает что-нибудь (и не нажмёт ). Теперь рассмотрим первую часть команды: name =. Она создаёт переменную под названием «name». Что такое переменная? Переменную можно представить себе в виде ящика. В ящике можно хранить вещи: ботинки, части компьютера, бумаги, всё, что туда влезет. Ящику всё равно, что лежит внутри — оно просто лежит там. В нашем примере он хранит то, что вы напечатаете. Я напечатал Ferd Burphel. В данной программе Python просто берёт введённое значение и сохраняет его в ящике «name», чтобы использовать в программе в дальнейшем.
В этой строке мы опять используем команду print для вывода текста на экран, в данном случае для вывода «Hello there, » и того, что хранится в переменной «name» и восклицательного знака в конце. В данной строке мы соединяем три куска текста: «Hello there», информацию в переменной «name» и восклицательный знак.
Теперь давайте быстро обсудим то, что мы сделали, и перейдём к работе над следующим примером. Откройте окно терминала и наберите:
Вы должны увидеть что-то наподобие этого:
и нажмите Enter. вы увидите:
Обратите внимание, что мы набрали слово «print» в нижнем регистре. Что произойдёт, если набрать «Print (2+2)»? Интерпретатор ответит следующим образом:
Теперь поработаем с переменными ещё раз. Введите:
Вы увидите, что ничего не происходит, за исключением того, что Python отобразит приглашение «>>>». Всё нормально. Мы поручили Python создать переменную (ящик) под названием «var» и положить в неё результат сложения «2+2». Чтобы увидеть, что теперь находится в переменной «var», введите:
и нажмите Enter.
Теперь мы можем снова использовать переменную «var» как число 4. Например, так:
Если мы снова наберём «print (var)», то увидим следующее:
Переменная «var» не изменилась. В ней осталась храниться сумма 2+2, то есть 4.
Конечно, данная программа очень простая и написана для этого урока для начинающих. В последующих уроках программы станут более сложными. А сейчас давайте рассмотрим ещё несколько примеров с переменными.
Введите в интерпретаторе:
Вы создали переменную под названием «strng», которая содержит значение «The time has come for all good men to come to the aid of the party!». С этого момента (пока мы работаем с этим экземпляром интерпретатора) переменная «strng» будет содержать то же значение, пока мы её не изменим. Что будет, если мы попробуем умножить эту переменную на 4?
Произошло не совсем то, что вы ожидали. Python напечатал значение переменной «strng» 2 раза. Почему? Интерпретатор знал, что переменная «strng» — это строка, а не число. Невозможно производить математические операции над строками.
Если бы у нас была переменная под названием «s», которая содержала бы значение «4» как показано ниже:
Кажется, что переменная «s» содержит число 4, но это не так. Она содержит текстовое значение «4». И если мы наберем «print (s * 4)», то получим…
Снова интерпретатор знает, что переменная «s» — это строка, а не число. Он знает это, потому что мы взяли число 4 в одинарные кавычки, что означает, что оно является строкой. Мы можем проверить это, набрав «print type(s)», чтобы увидеть, какой тип система присвоила данной переменной.
Подтверждено. Переменная имеет тип «строка». Если мы захотим использовать её в качестве числа, то мы напечатаем следующее:
Строка «s», содержащая значение «4», преобразована в число и умножена на 4, что равно 16.
Теперь у Вас есть основные знания о командах print и input, создании переменных и разнице между строками и числами.
Пойдём дальше. В интерпретаторе Python введите quit() для выхода в командную строку.
Пример цикла For
Теперь давайте рассмотрим пример программирования цикла. Запустите текстовый редактор и наберите следующую программу:
Не забудьте поставить символ табуляции перед строкой «print (cntr)». Это важно. В Python для указания на блоки кода используются не круглые «(» и фигурные «
Сохраните программу под именем «for_loop.py». До её запуска давайте поговорим о том, что такое цикл «for».
Цикл — это код, выполняющий определённую инструкцию или набор инструкций определённое число раз. В нашей программе мы выполним цикл 10 раз, печатая значение переменной «cntr». Вот перевод команды на русский язык «присвоить переменной «cntr» значение 0, выполнить печать значения переменной «cntr», прибавить к переменной «cntr» 1 и повторить это 10 раз». Выглядит довольно просто. Часть кода «range(0,10)» говорит: начать с 0, повторять, пока значение переменной «cntr» не будет равно 10, и выйти.
Теперь, как раньше, выполните команду
и запустите программу:
Кажется, программа работает, но почему она считает только до 9 и останавливается? Посмотрите её вывод. Напечатано 10 цифр: от 0 до 9. Это то, что мы запрограммировали: напечатать значение переменной «cntr» 10 раз, каждый раз добавляя единицу к переменной, и выйти, когда её значение будет равно 10.
Теперь вы видите, что программирование может быть как простым, так и сложным. Вы должны точно знать, что вы хотите от программы. Если вы измените команду «range» на «range(1,10)», она начнёт считать с 1, но остановится на 9, так как при достижении верхнего порога (10) цикл прерывается. Чтобы заставить программу печатать «1,2,3,4,5,6,7,8,9,10», надо заменить команду на «range(1,11)», так как цикл «for» прерывается при достижении второго числа в команде «range».
Обратите также внимание на синтаксис цикла. Двоеточие в команде «for переменная in range(начальное значение,конечное значение):» означает начало блока кода, который должен быть смещен вправо. Вы должны использовать двоеточие «:» и смещать код вправо до конца блока — это очень важно.
Если мы изменим нашу программу таким образом:
Мы увидим на экране следующее:
Убедитесь в том, что вы соблюдаете уровни вложенности. Запомните: от них зависит выделение блоков. В следующем уроке мы подробнее рассмотрим уровни вложенности.
Консольные приложения — это те, которые вы запускаете в терминале. Скорее всего, вы уже пытались их создать. Или, по крайней мере, думали об их создании.
Но создание консольного приложения — это одно, а публикация его в репозиторий с открытым кодом (например, PyPI) — совсем другое. Хотя ни первое, ни второе не является чем-то запредельно трудным.
В этой статье я подробно расскажу, как можно создать простой CLI на Python и опубликовать его в PyPI.
Начало
Не так давно я занялся изучением уязвимостей open-source кода и понял, что хочу иметь в арсенале инструмент командной строки, который мог бы находить уязвимости напрямую из терминала. Уязвимости open-source кода обычно публикуются в открытых базах данных. Их можно найти на таких сайтах, как CVE, NVD, WhiteSource Vuln и т.д.
В этой статье мы создадим примитивный скрейпер для поиска и просмотра уязвимостей с сайта CVE, обернем его в простое консольное приложение и опубликуем на PyPI.
Для начала нужно настроить среду разработки и установить необходимые модули. Я предлагаю установить виртуальную среду. Это простое решение, которое позволит избежать конфликтов между версиями модулей.
Для создания виртуальной среды можно воспользоваться командой python -m venv <path/name> (для Python 3) либо установить virtualenvwrapper с помощью pip install virtualenvwrapper и создать виртуальную среду virtualenv через mkvirtualenv -p /path/topython <path/name> .
После того, как виртуальная среда настроена и активирована, вы можете создать папку проекта и установить необходимые модули:
Как только все успешно запустилось, откройте свой проект в любом редакторе кода. Вы увидите похожую структуру:
Создание веб-скрейпера
Для того, чтобы искать и просматривать уязвимости на сайте CVE, потребуется веб-скрейпер. Он поможет нам собирать информацию об уязвимостях. Мы создаем скрейпер в Requests и BeautifulSoup. Вот что будет делать наш скрейпер:
1. искать уязвимости;
2. получать информацию об уязвимости по ее названию на CVE.
Теперь откроем папку cver и создадим в ней файл под названием cve_scraper . Затем пропишем его базовые настройки:
Поиск уязвимостей
Например, через URL можно получить список всех уязвимостей, связанных с Python:
Для извлечения данных открываем инструменты разработчика ( Developer Console ) и исследуем DOM-элемент с нужным представлением. Для этого кликните правой кнопкой по любому месту на странице и выберите “исследовать элемент” ( inspect element ) либо нажмите Ctrl + F12 .
Если вы присмотритесь к DOM-структуре выше, то увидите, что результаты представлены в виде таблицы, а каждое значение указано в отдельной строке под таблицей. Такие данные можно запросто извлечь:
1. отправляем запрос в SEARCH_URL с помощью Requests и получаем DOM-содержимое;
2. преобразуем DOM-содержимое в объекты BeautifulSoup . Это позволит нам выделять DOM-элементы с помощью CSS-селекторов, XPATH и других методов;
Просмотр информации об уязвимостях
Откройте инструменты разработчика и исследуйте DOM-структуру.
Такая структура чуть сложнее, поскольку в строках таблицы отсутствует ID или название класса. Поэтому нам нужно пройтись циклом по каждой строке и проверить, не является ли она подзаголовком. Если да, то следующий элемент берется в качестве содержимого-потомка. Каждый подзаголовок отображается в th , а его содержимое — в td .
Готово! Мы успешно создали веб-скрейпер с CVE. Теперь добавим в него две функции ( search и lookup_sve ), которые будут искать уязвимости и получать информацию по ним через CVE-ID .
Создание консольного приложения
Наш следующий шаг — структурирование и создание консольного приложения через библиотеку Click.
Click — это Python-пакет для создания красивых интерфейсов командной строки с минимальным количеством кода и возможностью компоновки. Это один из лучших Python-пакетов для создания CLI, и с ним очень удобно работать.
Click позволяет создавать интерфейсы командной строки любого уровня — от самых простых до навороченных (например, Heroku).
В нашем CLI мы реализуем две команды:
1. поиск уязвимости;
2. просмотр уязвимости.
В папке cver создаем файл под названием __main__.py и прописываем его базовые настройки:
Поиск уязвимостей
Здесь мы будем импортировать функцию поиска search из веб-скрейпера и передавать ей аргумент keyword из командной строки. Таким образом, приложение будет искать уязвимости, совпадающие с ключевым словом:
Для запуска этой команды:
Просмотр уязвимости
Принцип тот же: используем lookup_cve из веб-скрейпера и передаем туда аргумент name из команды look_up .
Для запуска этой команды:
Готово! Мы успешно создали инструмент командной строки по поиску с CVE.
Публикация консольного приложения на PyPI
После того, как мы создали консольное приложение и убедились в его работоспособности, можно опубликовать его на PyPI в публичном доступе.
PyPI — это хранилище приложений для пакетов Python. Там можно найти практически все пакеты, которые устанавливаются через pip . Для публикации пакета потребуется аккаунт на PyPI. Если он у вас уже есть, то смело читайте дальше.
Настройка пакета
Следующий шаг — это настройка Python-пакета с помощью setup.py . Если вы хотите, чтобы ваш пакет попал на PyPI, то нужно снабдить его базовым описанием. Эта информация указывается в файле setup.py .
Откройте setup.py в основной директории проекта и поместите в начало файла следующий код:
В примере выше мы преобразовали содержимое файла README.md в одну строку для дальнейшего использования. Кроме того, мы перечислили все необходимые модули из requirements.txt и сгенерировали ссылки на их зависимости.
Ваш файл requirements.txt выглядит примерно так:
Теперь давайте рассмотрим параметры настроек:
В коде выше мы добавили множество строк. Но подробнее обсудим только те из них, которые нужны для установки.
1. name — название пакета, которое появится на PyPI;
2. version — текущая версия пакета;
3. packages — пакеты и подпакеты с исходным кодом. В ходе установки мы пользуемся модулем find_packages . Он автоматически находит все подпакеты;
4. install_requires — используется для перечисления всех зависимостей или сторонних библиотек пакета. В cver мы пользуемся Requests, Beautifulsoup 4 и Click. Их нужно включить в требования к установке install_requires . Нам не нужно добавлять эту информацию вручную, поскольку она присутствует в requirements.txt ;
5. entry_points — используется для создания скриптов, которые вызывают функцию внутри пакета. В данном случае мы создаем новый скрипт cver , который вызывает main() внутри файла cver/__main__.py . Наш основной элемент — это __main__.py , который вызывает функцию main() для запуска Click.
До того, как опубликовать пакет на PyPI или выложить в открытый доступ, необходимо снабдить его документацией. То, как будет выглядеть документация, целиком и полностью зависит от самого проекта. Это может быть как простой файл README.md , так и Readme.rst .
Пример хорошо оформленного README.md :
Кроме того, не забудьте создать файл .gitignore :
Публикация на PyPI
Теперь ваш пакет готов к публикации на PyPI. Еще раз проверьте, есть ли у вас уже аккаунт на PyPI. Добавьте к нему тестовый аккаунт на тестовом сервере PyPI. Этот аккаунт нужен для тестирования пакетов перед публикацией их на рабочем сервере.
Загружать Python-пакеты на PyPI мы будем с помощью специального инструмента — Twine. По идее, вы уже установили его на одном из предыдущих этапов. Если нет, то это можно сделать через pip install twine .
Создание и локальное тестирование пакета на тестовом сервере
Python-пакеты, опубликованные на PyPI, не распространяются в виде «голого» кода. Они оборачиваются в дистрибутивы. Самыми распространенными форматами дистрибутивов в Python являются Wheels и Source Archives.
Wheels — это zip-архив с кодом и готовыми расширениями. Source Archives содержит исходный код и вспомогательные файлы, упакованные в tar-архив.
Для локального тестирования пакета выполните:
Теперь мы можем использовать его как:
Для проверки пакета на тестовом сервере PyPI нужно сгенерировать сборку для локального тестирования. При создании этой сборки сгенерируются архивы Wheels и Source Archives.
Код ниже сгенерирует два файла в директории dist :
Затем воспользуемся Twine. Теперь мы можем загрузить пакет на тестовый сервер PyPI:
Затем у вас спросят логин и пароль.
Если пакет загружается на тестовый сервер без ошибок, то он готов к публикации на рабочем сервере. Проверить можно здесь.
Для установки из TestPyPI выполните следующую команду:
В тестовой среде вы можете проверить все команды и убедиться в их правильности перед публикацией пакета на рабочем сервере.
Протестировав все команды локально, переходите к публикации пакета на рабочем сервере:
В процессе загрузки укажите свой логин и пароль. Вот и все!
Теперь пакет можно установить через:
Поздравляю! Ваш пакет был опубликован на PyPI. Просмотреть его можно здесь!
Заключение
В этой статье я пошагово объяснил процесс создания и публикации консольного приложения на Python.
Python предоставляет нам два способа запуска программы:
- Использование подсказки интерактивного помощника.
- Использование файла сценария.
Давайте подробно обсудим каждый из них.
Интерактивная подсказка помощника
Python предоставляет нам возможность выполнять инструкции интерактивного помощника. Это предпочтительнее в том случае, когда нас беспокоит вывод каждой строки программы Python.
Чтобы использовать интерактивный режим, откройте терминал(или командную строку) и введите python(python3 в случае, если в вашей системе установлены Python2 и Python3).
Откроется следующее приглашение, в котором мы можем выполнить оператор Python и проверить влияние на консоль.
После написания отчета о печати нажмите клавишу Enter.
Использование файла сценария(Программирование в режиме сценария)
Подсказка интерпретатора лучше всего подходит для выполнения однострочных операторов кода. Однако мы не можем писать код каждый раз на терминале. Не рекомендуется писать несколько строк кода.
Используя режим сценария, мы можем записать многострочный код в файл, который может быть выполнен позже. Для этого нам нужно открыть редактор, например блокнот, создать файл с именем и сохранить его с расширением .py, что означает «Python». Теперь мы реализуем приведенный выше пример, используя режим скрипта.
Чтобы запустить этот файл с именем first.py, нам нужно запустить следующую команду на терминале.
Шаг 2: Теперь напишите код и нажмите «Ctrl + S», чтобы сохранить файл.
Результат будет показан следующим образом.
- Откройте командную строку и перейдите в каталог.
- Нам нужно ввести ключевое слово python, затем имя файла и нажать Enter, чтобы запустить файл Python.
Многострочные операторы
Многострочные операторы записываются в блокнот как редактор и сохраняются с расширением .py. В следующем примере мы определим выполнение нескольких строк кода с помощью скрипта Python.
Плюсы и минусы режима сценария
Режим сценария также имеет несколько преимуществ и недостатков. Давайте разберемся в следующих преимуществах запуска кода в режиме скрипта:
- Мы можем запускать несколько строк кода.
- Отладка выполняется легко в режиме сценария.
- Подходит как для новичков, так и для экспертов.
Посмотрим на недостатки скриптового режима:
- Нужно сохранять код каждый раз, если мы вносим в него какие-либо изменения.
- Когда мы запускаем одну или несколько строк кода, это может быть утомительно.
Начало работы с PyCharm
В нашей первой программе мы использовали gedit в CentOS в качестве редактора. В Windows у нас есть альтернатива, например блокнот или блокнот ++, для редактирования кода. Однако эти редакторы не используются в качестве IDE для Python, поскольку они не могут отображать предложения, связанные с синтаксисом.
JetBrains предоставляет самую популярную и широко используемую кроссплатформенную IDE PyCharm для запуска программ Python.
Установка PyCharm
Windows
Чтобы создать первую программу для Pycharm, выполните следующий шаг.
- Мы можем сохранить созданный проект в выбранном по желанию месте памяти или оставить расположение файла как есть, но, по крайней мере, изменить имя проекта по умолчанию без названия на «FirstProject» или что-то значимое.
- Pycharm автоматически найдет установленный интерпретатор Python.
- После изменения имени нажмите кнопку «Создать».
Базовый синтаксис Python
Отступы в Python
Отступы Python определяют, какая группа операторов принадлежит конкретному блоку. В языках программирования, таких как C, C ++, java, для определения блоков кода используются фигурные скобки <>.
В Python операторы, находящиеся на одном уровне справа, принадлежат одному блоку. Мы можем использовать четыре пробела для определения отступа. Давайте посмотрим на следующие строки кода.
В приведенном выше коде цикл for имеет блоки кода, если оператор имеет блок кода внутри цикла for. Оба с четырьмя пробелами с отступом. Последний оператор print() без отступа; это означает, что он не принадлежит циклу for.
Комментарии в Python
Мы можем добавить комментарий в каждую строку кода Python.
Типы комментариев
Мы также можем написать комментарий рядом с оператором кода. Рассмотрим следующий пример.
Мы также можем использовать другой способ.
Это основное введение в комментарии. Просмотрите наш урок по комментариям Python, чтобы изучить его подробно.
Идентификаторы Python
Идентификаторы Python относятся к имени, используемому для идентификации переменной, функции, модуля, класса, модуля или других объектов. Есть несколько правил, которым нужно следовать при присвоении имени переменной Python.
- Имя переменной должно начинаться с английской буквы или символа подчеркивания(_).
- Имя переменной не может начинаться с числа.
- В имени переменной нельзя использовать специальные символы.
- Имя переменной чувствительно к регистру.
Мы определили базовый синтаксис языка программирования Python. Мы должны ознакомиться с основной концепцией любого языка программирования. Как только мы запомним концепции, упомянутые выше, изучение Python станет проще.
Python часто называют языком межпрограммной склейки, потому что он чрезвычайно гибкий и хорошо интегрируется с существующими программами. На текущий момент уже написано огромное количество кода в виде скриптов с интерфейсом командной строки.
Разработка приложений с интерфейсом командной строки (CLI) чрезвычайно полезно, так как позволяет автоматизировать практически все. Но, со временем, CLI программы могут стать довольно сложными. Рассмотрим простой Python скрипт, который обращается по веб API к серверу и распечатывает выходные данные в консоль:
Скрипт распечатает User-Agent пользователя, выполнив вызов к API. Но что делать, когда Python скрипт командной строки начнёт расти и усложняться?
В данной статье будет рассказано:
- Почему click – лучшая альтернатива argparse и optparse
- Как создавать программы с простым CLI
- Как добавить обязательные аргументы командной строки в скрипты
- Как парсить флаги и параметры командной строки
- Как сделать приложения для командной строки более удобными, добавив текст справки
Все примеры кода в этом руководстве реализованы на Python 3.6. Они могут не работать с более ранними версиями Python, но если у вас возникнут проблемы, оставьте комментарий.
Зачем нам писать скрипты и инструменты командной строки на Python?
Приведенный выше фрагмент кода является простым примером и поэтому бесполезен. Реальные сценарии намного сложнее. Обычно они помогают создавать, тестировать и развертывать приложения, выполняя этот процесс автоматически.
В таких случаях очень важно писать скрипты более гибкими и настраиваемыми. Это позволяет передавать в сценарии имена серверов, учетные данные или любую другую информацию.
В стандартную библиотеку Python входят модули optparse и argparse, которые делают жизнь разработчика намного проще. Но прежде чем рассматривать их более подробно, давайте введём терминологию.
Основы интерфейса командной строки
Интерфейс командной строки (CLI) начинается с имени исполняемого файла. Введя его имя в консоли, пользователь получает доступ к главной точке входа в скрипт, например, к pip.
Основными параметрами передаваемые в CLI приложение можно разделить на следующие группы:
- Аргументы – обязательные параметры, передаваемые скрипту. Если их не определять, CLI вернет ошибку. Например, django– это аргумент в команде pip install django.
- Опции – необязательные ([]) параметры, объединяющие имя и часть значения, например -cache-dir ./my-cache. Программе pip сообщается, что значение ./my-cache должно использоваться для определения каталога кэша.
- Флаги – специальные опции, которые включают или отключают определенное поведение. Чаще всего это --help.
Вероятно, вы уже использовали CLI, когда устанавливали Python пакет, выполнив pip install <PACKAGE NAME>. Команда install сообщает CLI, что необходимо получить доступ к функции устанавливающей пакет и предоставить доступ к параметрам, характерным для этой функции.
Фреймворки командной строки, доступные в стандартной библиотеке Python 3.x
Добавление команд и опций в скрипты чрезвычайно полезно, но разбор командной строки не так очевиден, как это может показаться. Вместо того, чтобы начинать писать свои собственные парсеры, рационально воспользоваться одним из множества Python пакетов, которые уже решили эту задачу.
Двумя наиболее известными пакетами являются optparse и argparse. Они являются частью стандартной библиотеки Python по принципу «батарейки идут в комплекте».
Они в основном обеспечивают схожую функциональность и работают очень похоже. Самое большое отличие заключается в том, что библиотека optparse устарела и запрещена в Python 3.2, а argparse считается стандартом для реализации CLI в Python.
Более подробную информацию о них можно найти в документации по Python. Чтобы иметь представление как выглядит скрипт с argparse, приведем пример:
Код приведённый выше нельзя назвать интуитивно понятным и легко читаемым. Поэтому рекомендуется использовать click.
Использование click в качестве лучшей альтернативы
click разрешает ту же задачу, что и optparse и argparse, но использует несколько иной подход. Он использует концепцию декораторов. Это требует реализацию команд в виде функций, которые потом можно обернуть декоратором.
Основная причина, почему используют click – это то, что можно легко создать многофункциональный CLI с небольшим количеством кода. При этом код остаётся легко читаемым, даже когда CLI растет и становится более сложным.
Простой интерфейс командной строки Python с click
Создадим простое CLI приложение на основе click, который распечатывает текст в консоль.
Прелесть click – это то, что мы бесплатно получаем некоторые дополнительные функции. Не реализовывая никаких вспомогательных возможностей добавив параметр --help, распечатается основная страница справки в командную строку:
Более реалистичный пример CLI с click
Теперь, когда известно, как click упрощает создание простого CLI, рассмотрим более реалистичный пример. Напишем программу, которая позволяет взаимодействовать с веб API. Сегодня многие используются ими, потому что они предоставляют доступ к некоторым любопытным данным.
API который будет рассматриваться для оставшейся части этого материала – это OpenWeatherMap API. Он сообщает текущую погоду, а также прогноз на пять дней для определенного местоположения. Начнем с шаблона API, возвращающего текущую погоду для местоположения.
Давайте посмотрим, что произойдет, когда будет вызван API для города Москва:
- q – местонахождение
- appid - это ключ к API
Также можно создать простую реализацию с использованием Python и библиотеки Requests (будем игнорировать обработку ошибок и неудачные запросы для простоты.)
Функция создаёт простой запрос к API погоды, используя два параметра запроса. Она принимает обязательный аргумент location, который является строкой. Также можно предоставить ключ API, передав api_key в вызове функции. Он является необязательным и используется для примера по умолчанию.
Результат работы программы для Москвы
Парсинг обязательных параметров с click
Простая функция current_weather позволяет создавать собственный CLI с передачей пользователем аргумента location. Результат работы программы должен быть таким:
Рассмотрим простой пример, немного изменив предыдущий, указав аргумент location.
Всё, что нужно сделать, это добавить дополнительный декоратор к функции main и дать ему имя. click использует это имя в качестве имени аргумента, передаваемого в функцию обёртку.
В нашем случае значение расположения будет передано в функцию main через аргумент location.
Можно также использовать тире (-) в именах, таких как API-ключ, который click превратит в «змеиный регистр» для имени аргумента в функции, например main(api_key).
Реализация основывается на простой функции current_weather, которая запрашивает погоду для location. Далее вызывается оператор print для вывода информации о погоде.
Оператор print выглядит немного странно, потому что это новый способ форматирования строк добавленный в Python 3.6+, называемый форматированием f-string.
Парсинг необязательных параметров с click
На данный момент функция current_weather всегда возвращает погоду в Москве начиная с января 2017 года. Также нужно определить реальный ключ к API. Для бесплатного получения ключа доступа зарегистрируйтесь на сайте openweathermap.
Изменим URL для текущей погоды location.
Итак, добавим новый параметр в CLI, который позволяет указать ключ API. Но сначала нужно определиться, должен это быть аргумент или опция. Определим параметр как опция, потому что добавление именованного параметра, такого как --api-key, делает его более явным и очевидным.
Модифицированная версия CLI приложения
Таким образом добавлен ещё один декоратор функции main. На этот раз используется декоратор @click.option, добавляя опцию с ведущими двойными тире (-). Также можно определить краткую опцию с одним тире (-), чтобы реализовать краткий пользовательский ввод.
Как уже было сказано, click создает аргумент, переданный функции main из длинной версии имени. В случае опции, фреймворк распаковывает ведущие тире и превращает их в snake case. --API-key превращается в api_key.
Теперь пользователь CLI приложения может использовать собственный ключ и определить любое местоположение:
Добавление справки по использованию приложения
Далее реализуем возможность вывода краткой документации для начинающего пользователя.
Сначала проверим, что распечатает приложение после запуска с флагом - -help.
В заключение добавим справочную информацию о назначении и кратких примерах использования. Самый простой и самый питоничный способ – это добавление docstring к функции main. Это необходимо выполнять в любом случае, так что это даже не лишняя работа:
Объединяя все изменения, получаем результат:
Результаты и резюме
Итак, в данной статье были даны ответы на следующие вопросы:
- Почему click лучше, чем argparse и optparse
- Как создать простой CLI
- Как добавить обязательные аргументы командной строки в скрипты
- Как парсить флаги и параметры командной строки
- Как сделать приложения для командной строки более удобными, добавив текст справки
Ниже приведен полный пример кода. Не стесняйтесь использовать его в своих проектах
Читайте также: