Рубрики
Без рубрики

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

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

Автор оригинала: Robley Gori.

Вступление

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

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

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

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

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

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

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

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

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

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

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

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

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

Для этой демонстрации мы сначала построим нашу функцию сокращения, а затем обернем ее функциональность с помощью 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-адрес и отправляет его в Shorte.st API и возвращает сокращенный 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 для указания допустимых значений аргумента, таких как yes и no.
  • С помощью опции type мы также можем указать тип, в который будет преобразована наша команда, например, преобразование аргументов в целые числа.

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

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

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

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

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

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

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

$ 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 сгенерировал текст справки для нашего скрипта, мы можем выполнить ваш скрипт с флагом -help для отображения текста справки следующим образом:

$ 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 .