Создание утилит командной строки с помощью Python argparse

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

Вступление

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

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

В этом посте мы argparse модуль Python argparse и воспользуемся им для создания простого инструмента командной строки, который поможет нам быстро сокращать URL-адреса.

Интерфейс командной строки

Интерфейс командной строки - это текстовый пользовательский интерфейс, который предоставляет средства взаимодействия с компьютером с помощью текстовых команд. Программа, которая облегчает это взаимодействие, открывая интерфейс, известна как интерпретатор командной строки или оболочка .

Он принимает команды в форме ввода текста, выполняет программы на основе предоставленного ввода, а затем отображает вывод в интерфейсе. Доступно множество оболочек, первыми из которых являются оболочка Bourne и оболочка C для систем на основе Unix. Bourne Again Shell (также известная как bash) - чрезвычайно популярное расширение Bourne Shell наряду с Korn Shell (ksh).

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

Интерфейсы командной строки предлагают подсказку, которая обычно представляет собой знак доллара ( $ ), который указывает, что вы можете ввести свою команду. Однако это приглашение также указывает на то, что введенная команда будет выполняться без корневого доступа.

Когда root-доступ предоставляется текущему пользователю, взаимодействующему с CLI, подсказка меняется на знак решетки ( # ).

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

Сценарии

Большинство интерпретаторов командной строки поставляются с некоторыми базовыми командами, которые можно вызывать через интерфейс командной строки для выполнения определенных задач. Вот некоторые из распространенных:

  • uptime : указывает, как долго компьютер был включен
  • date : возвращает текущую дату и время
  • ls : возвращает список всех файлов и папок в каталоге.
  • cd : используется для перехода из одного каталога в другой
  • pwd : используется для отображения текущего рабочего каталога
  • man : Используется для отображения руководства или инструкций по любой команде.
  • touch : используется для создания новых пустых файлов.
  • mkdir : используется для создания новых каталогов

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

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

Мы можем писать сценарии оболочки, которые состоят из выполняемых команд оболочки, но также мы можем выполнять другие языки высокого уровня, такие как Python и JavaScript.

Что такое argparse ?

Сценарий оболочки Python - это обычная программа Python, выполняемая интерпретатором командной строки. При выполнении сценария оболочки аргументы передаются в наш сценарий через sys.argv . Эта переменная представляет собой список аргументов, переданных нашей программе, включая имя сценария, которое также является первым аргументом.

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

Модуль argparse помогает нам анализировать аргументы, переданные нашим скриптом, и обрабатывать их более удобным способом. Он также добавляет функции настройки, такие как наименование нашей программы и добавление описаний более простым способом.

argparse также предоставляет нам средства для настройки инструкций по использованию для нашего скрипта и указания, какие аргументы необходимы, а какие - необязательны. Чтобы изучить все эти функции и многое другое, мы создадим нашу собственную утилиту Python CLI в следующем разделе.

Демо-приложение

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

Для этой демонстрации мы будем использовать Shorte.st в качестве нашего провайдера, поскольку его API прост и понятен.

После создания учетной записи мы можем перейти в раздел Link Tools и выбрать Developers API . Здесь мы найдем наш токен доступа и URL-адрес, который наш скрипт будет использовать для сокращения наших URL-адресов.

Как только пользователь предоставит URL-адрес нашей утилите командной строки для сокращения, мы отправим URL-адрес в конечную точку API Shorte.st вместе с нашим токеном доступа. Ответом будет наш сокращенный URL-адрес и сообщение о статусе.

Давайте начнем с создания виртуальной среды и установки модуля запросов , который мы будем использовать для отправки HTTP-запросов в API:

 $ mkdir pyshortener && cd pyshortener 
 $ virtualenv --python=python3 env --no-site-packages 
 $ source env/bin/activate 
 $ pip install requests 

В первой строке выше мы фактически объединили две команды в одну, используя двойной амперсанд ( && ). Это позволяет нам выполнять команды последовательно, если первая команда не дает сбоя, что предотвращает выполнение второй команды.

После создания нашей виртуальной среды и ее активации мы устанавливаем нашу зависимость Python.

argparse нашу функцию сокращения, а затем обернем ее функциональность с помощью argparse в окончательный сценарий:

 import requests 
 from requests.exceptions import ConnectionError 
 import json 
 
 def shorten_url(url): 
 try: 
 response = requests.put("https://api.shorte.st/v1/data/url", 
 {"urlToShorten": url}, 
 headers={"public-api-token": "[MY-API-TOKEN]"}) 
 
 api_response = json.loads(response.content) 
 
 return {"status": api_response['status'], 
 "shortenedUrl": api_response['shortenedUrl'], 
 "message": "URL shortened successfully"} 
 
 except ConnectionError: 
 return {"status": "error", 
 "shortenedUrl": None, 
 "message": "Please ensure you are connected to the internet and try again."} 
 
 shorten_url(www.stackabuse.com) 

Наша функция принимает URL-адрес, отправляет его в API Shorte.st и возвращает сокращенный URL-адрес. Давайте сократим www.stackabuse.com , выполнив наш скрипт:

 $ python pyshortener.py 
 {'status': 'ok', 'shortenedUrl': 'http://gestyy.com/w6ph2J', 'message': 'URL shortened successfully'} 

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

Мы собираемся пойти дальше и разрешить пользователям передавать URL-адрес в качестве аргумента при выполнении сценария. Для этого мы введем argparse чтобы помочь нам проанализировать аргументы, предоставленные пользователем:

 import requests 
 from requests.exceptions import ConnectionError 
 import json 
 import argparse # Add the argparse import 
 
 def shorten_url(url): 
 # Code stays the same... 
 
 # Create a parser 
 parser = argparse.ArgumentParser(description='Shorten URLs on the terminal') 
 
 # Add argument 
 parser.add_argument('--url', default="google.com", help="The URL to be shortened") 
 args = vars(parser.parse_args()) 
 print(args) 

В этой версии скрипта мы не вызываем shorten_url , а просто распечатываем аргументы, захваченные и проанализированные argparse .

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

После создания парсера мы теперь можем добавлять аргументы с помощью parser.add_argument() . Эта функция позволяет указать следующую информацию о наших аргументах:

  • Первый аргумент - это имя или флаг, используемый для идентификации наших аргументов. Необязательные аргументы обозначаются - , в нашем случае --url - необязательный аргумент.
  • Параметр по default позволяет указать значение по умолчанию, если пользователь не предоставил аргумент.
  • Параметр help кратко описывает аргумент.
  • Мы также можем использовать choice чтобы указать допустимые значения для аргумента, такие как да и нет.
  • С помощью type мы также можем указать тип, в который будет преобразована наша команда, например, преобразование аргументов в целые числа.

Когда мы запускаем наш скрипт без каких-либо аргументов, по умолчанию используется URL-адрес "google.com", как мы установили в методе add_argument

 $ python pyshortener.py 
 {'url': 'google.com'} 

Теперь , когда мы проходим www.stackabuse.com используя --url флаг, он устанавливается как значение в url - url ключа:

 $ python pyshortener.py --url www.stackabuse.com 
 {'url': 'www.stackabuse.com'} 

Теперь мы можем получить URL-адрес пользователя через командную строку и сократить его, изменив наш скрипт:

 if args.get('url'): 
 print(shorten_url(args['url'])) 

Когда мы запускаем его и передаем URL-адрес, мы должны получить вывод от API Shorte.st:

 $ python pyshortener.py --url stackabuse.com 
 {'status': 'ok', 'shortenedUrl': 'http://gestyy.com/w6pk2R', 'message': 'URL shortened successfully'} 

Хотя наш вывод не так дружелюбен, как нам хотелось бы, поэтому давайте создадим функцию для более удобного форматирования нашего вывода:

 def handle_output(result): 
 """ Function to format and print the output 
 """ 
 if result["status"] == "ok": 
 print(f"{result['message']}. Your shortened URL is:\n" 
 f"\t{result['shortenedUrl']}") 
 elif result["status"] == "error": 
 print(f"{result['message']}") 
 
 # Receive and process the argument 
 args = vars(parser.parse_args()) 
 
 if args.get('url'): 
 result = shorten_url(args['url']) 
 handle_output(result) 

Когда мы запускаем наш скрипт еще раз:

 $ python pyshortener.py --url www.stackabuse.com 
 URL shortened successfully. Your shortened URL is: 
 http://gestyy.com/w6pk2R 

Наш вывод стал более удобным для пользователя благодаря добавлению функции handle_output() . Чтобы увидеть, как argparse сгенерировал текст справки для нашего сценария, мы можем выполнить наш сценарий с -h чтобы отобразить текст справки следующим образом:

 $ python pyshortener.py -h 
 usage: pyshortener.py [-h] [--url URL] 
 
 Shorten URLs on the terminal 
 
 optional arguments: 
 -h, --help show this help message and exit 
 --url URL The URL to be shortened 

Заключение

Мы создали сценарий оболочки с использованием Python, чтобы помочь нам быстро сократить URL-адреса на терминале. Мы использовали argparse для анализа аргументов, которые передаются в наш скрипт, и даже определили значение по умолчанию в случае, если аргумент предоставлен.

В нашем скрипте теперь также есть красивое справочное сообщение, которое можно отобразить с помощью флага -h argparse означает, что нам не нужно было записывать его вручную.

Следующим шагом будет усовершенствование нашего скрипта для приема списка URL-адресов или чтения URL-адресов из текстового файла, чтобы упростить пакетное сокращение URL-адресов.

Исходный код скрипта в этом проекте можно найти здесь, на Github .

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus