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

Модуль Python argparse – Легко разбирать аргументы командной строки

При написании сценариев командной строки на Python мы могли столкнуться с ситуацией, когда нам нужно было бы добавить дополнительные параметры командной строки для нашей программы.

Автор оригинала: Pankaj Kumar.

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

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

Методы библиотеки Python argparse

Библиотека предоставляет нам различные методы для анализа и обработки строки аргумента и добавления удобных для пользователя параметров командной строки.

1. Создание анализатора аргументов

Чтобы обработать строку аргумента, нам сначала нужно построить синтаксический анализатор. Библиотека предоставляет нам argparse.ArgumentParser() для создания анализатора аргументов.

Формат: парсер.ArgumentParser(описание)

2. Добавьте аргументы в объект синтаксического анализатора

Следующим шагом будет добавление аргументов/параметров в анализатор интерфейса командной строки ( CLI ). Мы делаем это с помощью parser.add_argument() .

Формат: parser.add_argument(имя, метавар, тип, справка)

  • имя -> имя атрибута объекта синтаксического анализатора
  • metavar -> Он предоставляет другое имя для необязательного аргумента в сообщениях справки
  • тип -> Тип данных переменной (может быть int , str и т. Д)
  • справка -> Описание аргумента в сообщении справки

Пример, иллюстрирующий вышеприведенные концепции

import argparse

# Create the parser
parser = argparse.ArgumentParser(description='A Simple Program which prints to the console.')

parser.add_argument('integer', metavar='N', type=int, help='an integer to be printed')

args = parser.parse_args()

a = args.integer
print('Printing the integer')
print(a)

Выход

root@Ubuntu $ python argparse_example.py
usage: argparse_example.py [-h] N
argparse_example.py: error: the following arguments are required: N

root@Ubuntu $ python argparse_example.py 10
Printing the integer
10

root@Ubuntu $ python argparse_example.py -h
usage: argparse_example.py [-h] N

A Simple Program which prints to the console.

positional arguments:
  N           an integer to be printed

optional arguments:
  -h, --help  show this help message and exit

root@Ubuntu $ python argparse_example.py hi
usage: argparse_example.py [-h] N
argparse_example.py: error: argument N: invalid int value: 'hi'

Обратите внимание, что модуль заботится о проверке типа аргумента, гарантируя, что a должно быть целым числом, и что для работы программы должны быть переданы правильные аргументы. Это значение параметра type .

Дополнительные параметры интерфейса программы

Мы можем добавить/изменить дополнительные параметры в нашу программу, указав еще два необязательных параметра при создании объекта парсера, а именно prog и usage .

Формат: argparse.ArgumentParser(prog, использование, описание)

  • prog -> Указывает имя программы (обычно это sys.argv[0] по умолчанию, но может быть изменено с помощью этого параметра.
  • использование -> Задает формат использования в строке справки.
  • prefix_chars -> Задает символ префикса для необязательных аргументов (это - для систем Unix и /для Windows)

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

import argparse

# Create the parser
parser = argparse.ArgumentParser(prog='simple_printer',
                                usage='%(prog)s [options] integer string',
                                description='A Simple Program which prints to the Console',
                                prefix_chars='-')

# Add an integer argument
parser.add_argument('--integer', metavar='N',
                    type=int, help='an integer to be printed')

# Add a second string argument
parser.add_argument('--string', metavar='S',
                    type=str, help='a string to be printed')

# Parse the list of arguments into an object
# called 'args'
args = parser.parse_args()

print('Argument Object:', args)
print('Type of the Argument Object:', type(args))

first_argument = args.integer
second_argument = args.string

print('Printing the integer')
print(first_argument)

print('Printing the string')
print(second_argument)

1. Передача Необязательных Аргументов

Обратите внимание, что мы изменили имя аргументов на --integer и --string . Это связано с тем, что это стандартный формат для указания необязательных аргументов в скриптах Python. ( python script.py -o --опция )

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

Вывод для необязательных аргументов

root@Ubuntu $ python3 argparse_example.py --integer=10
Argument Object: Namespace(integer=10, string=None)
Type of the Argument Object: 
Printing the integer
10
Printing the string
None

Вывод для других случаев, показывающий, как argparse заботится обо всем за вас.

root@Ubuntu $ python3 argparse_example.py 10 Hello
Argument Object: Namespace(integer=10, string='Hello')
Type of the Argument Object: 
Printing the integer
10
Printing the string
Hello

root@Ubuntu $ python3 argparse_example.py 10
usage: simple_printer [options] --integer --string
simple_printer: error: the following arguments are required: S

root@Ubuntu $ python3 argparse_example.py -h
usage: simple_printer [options] integer string

A Simple Program which prints to the Console

optional arguments:
  -h, --help   show this help message and exit
  --integer N  an integer to be printed
  --string S   a string to be printed

root@Ubuntu $ python3 argparse_example.py --integer 10 --string Hi
Argument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: 
Printing the integer
10
Printing the string
Hi

root@Ubuntu $ python3 argparse_example.py --integer=10 --string=Hi
Argument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: 
Printing the integer
10
Printing the string
Hi

2. Использование коротких имен для необязательных параметров

Чтобы избежать записи полного имени параметра для каждого необязательного аргумента, в нашем скрипте можно использовать один параметр через дефис ( -o вместо --option ). argparse позволяет нам сделать это, просто добавив короткое имя опции в качестве первого параметра при добавлении аргумента в синтаксический анализатор.

Формат: parser.add_args('-o', '--option',)

В нашем предыдущем фрагменте мы просто добавили два небольших изменения в параметры --integer и --string :

# Add an integer argument
parser.add_argument('-i', '--integer', metavar='N',
                    type=int, help='an integer to be printed')

# Add a second string argument
parser.add_argument('-s', '--string', metavar='S',
                    type=str, help='a string to be printed')

Вывод, когда необязательные аргументы указаны с их короткими формами:

root@Ubuntu $ python3 argparse_example.py -s=Hi
Argument Object: Namespace(integer=None, string='Hi')
Type of the Argument Object: 
Printing the Integer
None
Printing the string
Hi

root@Ubuntu $ python3 argparse_example.py -s=Hi -i=10
Argument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: 
Printing the integer
10
Printing the string
Hi

Вывод

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

Рекомендации