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