argparse — Парсер для командно-строковых опций, аргументов и подкоманд
Новое в версии 3.2.
Исходный код: Lib/argparse.py
Модуль argparse упрощает создание удобных командных интерфейсов. Программа определяет необходимые аргументы, а argparse позаботится о том, как извлечь эти аргументы из sys.argv. Модуль argparse также автоматически генерирует сообщения справки и использования и выводит ошибки при передаче программе недопустимых аргументов.
Пример
Следующий код — это программа Python, которая принимает список целых чисел и выводит либо сумму, либо максимальное значение:
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
Предполагая, что код Python выше сохранен в файле prog.py, его можно запустить в командной строке, и он предоставит полезные сообщения справки:
$ python prog.py -h usage: prog.py [-h] [--sum] N [N ...] Process some integers. positional arguments: N an integer for the accumulator options: -h, --help show this help message and exit --sum sum the integers (default: find the max)
При запуске с соответствующими аргументами он выводит либо сумму, либо максимальное значение целых чисел из командной строки:
$ python prog.py 1 2 3 4 4 $ python prog.py 1 2 3 4 --sum 10
При передаче недопустимых аргументов будет выдана ошибка:
$ python prog.py a b c usage: prog.py [-h] [--sum] N [N ...] prog.py: error: argument N: invalid int value: 'a'
Следующие разделы проведут вас по этому примеру.
Создание парсера
Первый шаг при использовании argparse — создание объекта ArgumentParser:
>>> parser = argparse.ArgumentParser(description='Process some integers.')
Объект ArgumentParser будет хранить всю необходимую информацию для парсинга командной строки в типы данных Python.
Добавление аргументов
Заполнение объекта ArgumentParser информацией об аргументах программы осуществляется с помощью вызовов метода add_argument(). Обычно эти вызовы сообщают ArgumentParser о том, как преобразовать строки из командной строки в объекты. Эта информация хранится и используется при вызове parse_args(). Например:
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
... help='an integer for the accumulator')
>>> parser.add_argument('--sum', dest='accumulate', action='store_const',
... const=sum, default=max,
... help='sum the integers (default: find the max)')
Позже вызов parse_args() вернёт объект с двумя атрибутами, integers и accumulate. Атрибут integers будет списком из одного или нескольких целых чисел, а атрибут accumulate будет либо функцией sum(), если --sum было указано в командной строке, либо функцией max(), если это не так.
Парсинг аргументов
ArgumentParser выполняет парсинг аргументов с помощью метода parse_args(). Это даст возможность проверить командную строку, преобразовать каждый аргумент в соответствующий тип, а затем вызвать соответствующее действие. В большинстве случаев это означает создание простого объекта Namespace из атрибутов, полученных из командной строки:
>>> parser.parse_args(['--sum', '7', '-1', '42']) Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
В скрипте parse_args() обычно вызывается без аргументов, и ArgumentParser автоматически определяет аргументы командной строки из sys.argv.
Объекты ArgumentParser
-
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True) -
Создайте новый объект
ArgumentParser. Все параметры должны быть переданы в качестве ключевых аргументов. Каждый параметр имеет собственное более подробное описание ниже, но коротко они:-
prog - Название программы (по умолчанию:
os.path.basename(sys.argv[0])) - usage - Строка, описывающая использование программы (по умолчанию: генерируется из аргументов, добавленных в анализатор)
- description - Текст, отображаемый перед справкой по аргументу (по умолчанию, нет текста)
- epilog - Текст, отображаемый после справки по аргументу (по умолчанию, нет текста)
-
parents - Список объектов
ArgumentParser, чьи аргументы также должны быть включены - formatter_class - Класс для настройки вывода справки
- prefix_chars - Набор символов, которые предшествуют необязательным аргументам (по умолчанию: ‘-‘)
-
fromfile_prefix_chars - Набор символов, которые предшествуют файлам, из которых должны быть прочитаны дополнительные аргументы (по умолчанию:
None) -
argument_default - Глобальное значение по умолчанию для аргументов (по умолчанию:
None) - conflict_handler - Стратегия разрешения конфликтующих необязательных аргументов (обычно не требуется)
-
add_help - Добавить опцию
-h/--helpв анализатор (по умолчанию:True) -
allow_abbrev - Разрешает сокращать длинные опции, если сокращение однозначно. (по умолчанию:
True) -
exit_on_error - Определяет, будет ли ArgumentParser завершать работу с информацией об ошибке при возникновении ошибки. (по умолчанию:
True)
Изменено в версии 3.5: Параметр allow_abbrev был добавлен.
Изменено в версии 3.8: В предыдущих версиях allow_abbrev также отключал группировку коротких флагов, таких как
-vvдля обозначения-v -v.Изменено в версии 3.9: Параметр exit_on_error был добавлен.
-
prog - Название программы (по умолчанию:
В следующих разделах описывается использование каждого из них.
prog
По умолчанию объекты ArgumentParser используют sys.argv[0] для определения того, как отобразить имя программы в сообщениях справки. Этот параметр по умолчанию почти всегда желателен, потому что он сделает сообщения справки совпадающими с тем, как программа была вызвана в командной строке. Например, рассмотрим файл под названием myprogram.py со следующим кодом:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
Справка по этой программе отобразит myprogram.py в качестве имени программы (независимо от того, откуда программа была вызвана):
$ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] options: -h, --help show this help message and exit --foo FOO foo help $ cd .. $ python subdir/myprogram.py --help usage: myprogram.py [-h] [--foo FOO] options: -h, --help show this help message and exit --foo FOO foo help
Чтобы изменить это поведение по умолчанию, можно использовать другое значение с помощью аргумента prog= для ArgumentParser:
>>> parser = argparse.ArgumentParser(prog='myprogram') >>> parser.print_help() usage: myprogram [-h] options: -h, --help show this help message and exit
Обратите внимание, что имя программы, определяемое по sys.argv[0] или по аргументу prog=, доступно для сообщений справки с использованием формата %(prog)s.
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]
options:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
usage
По умолчанию ArgumentParser вычисляет сообщение usage по аргументам, которые он содержит:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [-h] [--foo [FOO]] bar [bar ...]
positional arguments:
bar bar help
options:
-h, --help show this help message and exit
--foo [FOO] foo help
Сообщения по умолчанию можно переопределить с помощью ключевого аргумента usage=:
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]
positional arguments:
bar bar help
options:
-h, --help show this help message and exit
--foo [FOO] foo help
Формат %(prog)s доступен для заполнения имени программы в сообщениях usage.
description
Большинство вызовов конструктора ArgumentParser используют ключевой аргумент description=. Этот аргумент предоставляет краткое описание того, что делает программа и как она работает. В сообщениях справки описание отображается между строкой использования командной строки и сообщениями справки по различным аргументам:
>>> parser = argparse.ArgumentParser(description='A foo that bars') >>> parser.print_help() usage: argparse.py [-h] A foo that bars options: -h, --help show this help message and exit
По умолчанию описание будет переноситься на новую строку, чтобы оно помещалось в заданном пространстве. Чтобы изменить это поведение, см. аргумент formatter_class.
epilog
Некоторые программы предпочитают отображать дополнительное описание программы после описания аргументов. Такой текст можно указать с помощью аргумента epilog= для ArgumentParser:
>>> parser = argparse.ArgumentParser( ... description='A foo that bars', ... epilog="And that's how you'd foo a bar") >>> parser.print_help() usage: argparse.py [-h] A foo that bars options: -h, --help show this help message and exit And that's how you'd foo a bar
Как и с аргументом description, текст epilog= по умолчанию переносится на новую строку, но это поведение можно настроить с помощью аргумента formatter_class для ArgumentParser.
parents
Иногда несколько анализаторов разделяют набор общих аргументов. Вместо повторения определений этих аргументов можно использовать один анализатор со всеми общими аргументами и передать его в аргумент parents= для ArgumentParser. Аргумент parents= принимает список объектов ArgumentParser, собирает все позиционные и необязательные действия из них и добавляет эти действия к объекту ArgumentParser, который создаётся:
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)
>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)
>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
Обратите внимание, что большинство родительских анализаторов будут указывать add_help=False. В противном случае ArgumentParser увидит две -h/--help опции (одну в родительском и одну в дочернем) и выведет ошибку.
Примечание
Вы должны полностью инициализировать анализаторы перед передачей их через parents= . Если вы измените родительские анализаторы после дочернего анализатора, эти изменения не будут отражены в дочернем.
formatter_class
Объекты ArgumentParser позволяют настроить форматирование справки, указав альтернативный класс форматирования. В настоящее время существует четыре таких класса:
-
class argparse.RawDescriptionHelpFormatter -
class argparse.RawTextHelpFormatter -
class argparse.ArgumentDefaultsHelpFormatter -
class argparse.MetavarTypeHelpFormatter
RawDescriptionHelpFormatter и RawTextHelpFormatter дают больший контроль над отображением текстовых описаний. По умолчанию объекты ArgumentParser переносят на новую строку тексты description и epilog в сообщениях справки командной строки:
>>> parser = argparse.ArgumentParser( ... prog='PROG', ... description='''this description ... was indented weird ... but that is okay''', ... epilog=''' ... likewise for this epilog whose whitespace will ... be cleaned up and whose words will be wrapped ... across a couple lines''') >>> parser.print_help() usage: PROG [-h] this description was indented weird but that is okay options: -h, --help show this help message and exit likewise for this epilog whose whitespace will be cleaned up and whose words will be wrapped across a couple lines
Передача RawDescriptionHelpFormatter в качестве formatter_class= указывает, что description и epilog уже отформатированы и не должны быть переносимы на новую строку:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.RawDescriptionHelpFormatter,
... description=textwrap.dedent('''\
... Please do not mess up this text!
... --------------------------------
... I have indented it
... exactly the way
... I want it
... '''))
>>> parser.print_help()
usage: PROG [-h]
Please do not mess up this text!
--------------------------------
I have indented it
exactly the way
I want it
options:
-h, --help show this help message and exit
RawTextHelpFormatter сохраняет пробелы для всех типов текстов справки, включая описания аргументов. Однако несколько новых строк заменяются одной. Если вы хотите сохранить несколько пустых строк, добавьте пробелы между новыми строками.
ArgumentDefaultsHelpFormatter автоматически добавляет информацию о значениях по умолчанию в каждое из сообщений справки по аргументам:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar ...]
positional arguments:
bar BAR! (default: [1, 2, 3])
options:
-h, --help show this help message and exit
--foo FOO FOO! (default: 42)
MetavarTypeHelpFormatter использует имя аргумента type для каждого аргумента в качестве имени отображения его значений (вместо использования dest, как это делает обычный форматировщик):
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float
positional arguments:
float
options:
-h, --help show this help message and exit
--foo int
prefix_chars
Большинство опций командной строки используют - в качестве префикса, например -f/--foo. Анализаторы, которым нужно поддерживать разные или дополнительные символы префикса, например, для опций, таких как +f или /foo, могут указать их с помощью аргумента prefix_chars= конструктора ArgumentParser:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
Аргумент prefix_chars= по умолчанию равен '-'. Передача набора символов, который не включает - приведет к тому, что опции -f/--foo будут запрещены.
fromfile_prefix_chars
Иногда, например, при работе со списком аргументов значительной длины, может быть целесообразно хранить список аргументов в файле вместо ввода их в командной строке. Если аргумент fromfile_prefix_chars= передаётся конструктору ArgumentParser, то аргументы, начинающиеся с любого из указанных символов, будут обрабатываться как файлы и будут заменены содержащимися в них аргументами. Например:
>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')
Аргументы, считываемые из файла, по умолчанию должны быть по одному на строке (см. также convert_arg_line_to_args()) и обрабатываются так, как если бы они находились в том же месте, что и исходный аргумент ссылки на файл в командной строке. Итак, в приведённом выше примере выражение ['-f', 'foo', '@args.txt'] считается эквивалентным выражению ['-f', 'foo', '-f', 'bar'].
Аргумент fromfile_prefix_chars= по умолчанию равен None, что означает, что аргументы никогда не будут обрабатываться как ссылки на файлы.
argument_default
В целом, значения по умолчанию аргументов задаются либо путём передачи значения по умолчанию в add_argument(), либо путём вызова методов set_defaults() с набором пар «имя-значение». Однако иногда может быть полезно указать общее значение по умолчанию для всех аргументов. Это можно сделать, передав ключевой аргумент argument_default= в ArgumentParser. Например, чтобы глобально подавить создание атрибутов при вызовах parse_args(), мы передаём argument_default=SUPPRESS:
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
allow_abbrev
Обычно, когда вы передаёте список аргументов методу parse_args() объекта ArgumentParser, он распознаёт сокращения длинных опций.
Эту функцию можно отключить, установив allow_abbrev в False:
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
Новое в версии 3.5.
conflict_handler
Объекты ArgumentParser не допускают двух действий с одинаковой строкой опции. По умолчанию объекты ArgumentParser генерируют исключение, если выполняется попытка создать аргумент со строкой опции, которая уже используется:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
Иногда (например, при использовании родительских элементов) может быть полезно просто переопределять более старые аргументы с той же строкой опции. Для получения этого поведения можно указать значение 'resolve' в аргументе conflict_handler= объекта ArgumentParser:
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]
options:
-h, --help show this help message and exit
-f FOO old foo help
--foo FOO new foo help
Обратите внимание, что объекты ArgumentParser удаляют действие только в том случае, если все его строки опций переопределены. Итак, в примере выше действие -f/--foo сохраняется как действие -f, поскольку только строка опции --foo была переопределена.
add_help
По умолчанию объекты ArgumentParser добавляют опцию, которая просто отображает сообщение справки парсера. Например, рассмотрим файл с именем myprogram.py с следующим кодом:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
Если -h или --help указаны в командной строке, будет выведена справка ArgumentParser:
$ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] options: -h, --help show this help message and exit --foo FOO foo help
Иногда может быть полезно отключить добавление этой опции справки. Это можно сделать, передав False в качестве аргумента add_help= для ArgumentParser:
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]
options:
--foo FOO foo help
Опция справки обычно -h/--help. Исключение составляет случай, если prefix_chars= указан и не включает -, в этом случае -h и --help не являются допустимыми опциями. В этом случае для префикса опций справки используется первый символ в prefix_chars:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/') >>> parser.print_help() usage: PROG [+h] options: +h, ++help show this help message and exit
exit_on_error
Обычно, когда вы передаёте недопустимый список аргументов методу parse_args() объекта ArgumentParser, он завершается с информацией об ошибке.
Если пользователь хочет вручную обрабатывать ошибки, эту функцию можно включить, установив exit_on_error в False:
>>> parser = argparse.ArgumentParser(exit_on_error=False)
>>> parser.add_argument('--integers', type=int)
_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
>>> try:
... parser.parse_args('--integers a'.split())
... except argparse.ArgumentError:
... print('Catching an argumentError')
...
Catching an argumentError
Новое в версии 3.9.
Метод add_argument()
-
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) -
Определяет, как должен быть обработан отдельный аргумент командной строки. Каждый параметр имеет своё подробное описание ниже, но вкратце они:
-
имя или флаги - либо имя, либо список строк флагов, например
fooили-f, --foo. - действие - базовый тип действия, которое должно быть выполнено при встрече этого аргумента в командной строке.
- nargs - количество аргументов командной строки, которые должны быть использованы.
- const - константное значение, необходимое для некоторых вариантов действия и nargs.
- значение по умолчанию - значение, которое используется, если аргумент отсутствует в командной строке и если он отсутствует в объекте пространства имен.
- тип - тип, в который должен быть преобразован аргумент командной строки.
- выбор - последовательность допустимых значений для аргумента.
- обязательность - требуется ли аргумент в командной строке (только для необязательных параметров).
- помощь - краткое описание того, что делает аргумент.
- метапеременная - имя аргумента в сообщениях об использовании.
-
dest - имя атрибута, которое будет добавлено к объекту, возвращённому
parse_args().
-
имя или флаги - либо имя, либо список строк флагов, например
В следующих разделах описывается использование каждого из них.
Имя или флаги
Метод add_argument() должен знать, ожидается ли необязательный аргумент, например -f или --foo, или позиционный аргумент, например список имён файлов. Поэтому первые аргументы, передаваемые в add_argument(), должны быть либо серией флагов, либо простым именем аргумента. Например, необязательный аргумент можно создать так:
>>> parser.add_argument('-f', '--foo')
в то время как позиционный аргумент можно создать так:
>>> parser.add_argument('bar')
Когда вызывается parse_args(), необязательные аргументы будут идентифицированы по префиксу -, а оставшиеся аргументы будут считаться позиционными:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
Действие
Объекты ArgumentParser связывают аргументы командной строки с действиями. Эти действия могут делать практически всё с аргументами командной строки, связанными с ними, хотя большинство действий просто добавляют атрибут к объекту, возвращаемому parse_args(). Аргумент ключевого слова action указывает, как должны обрабатываться аргументы командной строки. Доступные действия:
-
'store'- Просто сохраняет значение аргумента. Это действие по умолчанию. Например:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.parse_args('--foo 1'.split()) Namespace(foo='1') -
'store_const'- Сохраняет значение, указанное в ключевом аргументе const. Действие'store_const'чаще всего используется с необязательными аргументами, которые задают некий флаг. Например:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_const', const=42) >>> parser.parse_args(['--foo']) Namespace(foo=42) -
'store_true'и'store_false'- Это частные случаи'store_const'для хранения значенийTrueиFalseсоответственно. Кроме того, они создают значения по умолчаниюFalseиTrueсоответственно. Например:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') >>> parser.add_argument('--bar', action='store_false') >>> parser.add_argument('--baz', action='store_false') >>> parser.parse_args('--foo --bar'.split()) Namespace(foo=True, bar=False, baz=True) -
'append'- Сохраняет список и добавляет каждое значение аргумента в список. Это полезно, чтобы разрешить указание опции несколько раз. Пример использования:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) -
'append_const'- Сохраняет список и добавляет значение, указанное в ключевом аргументе const, в список. (Обратите внимание, что ключевой аргумент const по умолчанию равенNone.) Действие'append_const'обычно полезно, когда несколько аргументов должны хранить константы в одном списке. Например:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--str', dest='types', action='append_const', const=str) >>> parser.add_argument('--int', dest='types', action='append_const', const=int) >>> parser.parse_args('--str --int'.split()) Namespace(types=[<class 'str'>, <class 'int'>]) -
'count'- Подсчитывает количество появлений ключевого аргумента. Например, это полезно для повышения уровня детализации:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--verbose', '-v', action='count', default=0) >>> parser.parse_args(['-vvv']) Namespace(verbose=3)Обратите внимание, что по умолчанию значение будет
None, если не задано явно 0. -
'help'- Выводит полное сообщение справки обо всех параметрах в текущем парсере и затем завершает работу. По умолчанию действие help автоматически добавляется в парсер. СмотритеArgumentParserдля получения информации о том, как создаётся вывод. -
'version'- Ожидает ключевой аргументversion=в вызовеadd_argument()и выводит информацию о версии и завершает работу при вызове:>>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0') >>> parser.parse_args(['--version']) PROG 2.0 -
'extend'- Сохраняет список и расширяет каждое значение аргумента в списке. Пример использования:>>> parser = argparse.ArgumentParser() >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) Namespace(foo=['f1', 'f2', 'f3', 'f4'])Новое в версии 3.8.
Вы также можете указать произвольное действие, передав подкласс Action или другой объект, реализующий тот же интерфейс. BooleanOptionalAction доступен в argparse и добавляет поддержку булевых действий, таких как --foo и --no-foo:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction)
>>> parser.parse_args(['--no-foo'])
Namespace(foo=False)
Новое в версии 3.9.
Рекомендуемый способ создания пользовательского действия — это расширение Action, переопределяя метод __call__ и, по желанию, методы __init__ и format_usage.
Пример пользовательского действия:
>>> class FooAction(argparse.Action):
... def __init__(self, option_strings, dest, nargs=None, **kwargs):
... if nargs is not None:
... raise ValueError("nargs not allowed")
... super().__init__(option_strings, dest, **kwargs)
... def __call__(self, parser, namespace, values, option_string=None):
... print('%r %r %r' % (namespace, values, option_string))
... setattr(namespace, self.dest, values)
...
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=FooAction)
>>> parser.add_argument('bar', action=FooAction)
>>> args = parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None) '1' None
Namespace(bar='1', foo=None) '2' '--foo'
>>> args
Namespace(bar='1', foo='2')
Для получения более подробной информации см. Action.
nargs
Объекты ArgumentParser обычно связывают один аргумент командной строки с одним действием. Ключевой аргумент nargs связывает разное количество аргументов командной строки с одним действием. Доступные значения:
-
N(целое число).Nаргументы из командной строки будут собраны вместе в список. Например:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) >>> parser.add_argument('bar', nargs=1) >>> parser.parse_args('c --foo a b'.split()) Namespace(bar=['c'], foo=['a', 'b'])Обратите внимание, что
nargs=1производит список из одного элемента. Это отличается от значения по умолчанию, в котором элемент генерируется сам по себе.
-
'?'. Один аргумент будет потреблён из командной строки, если возможно, и представлен как один элемент. Если аргумент командной строки отсутствует, будет использовано значение из default. Обратите внимание, что для необязательных аргументов есть дополнительный случай — строка опции присутствует, но не за ней не следует аргумент командной строки. В этом случае будет использовано значение из const. Некоторые примеры для иллюстрации:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='?', const='c', default='d') >>> parser.add_argument('bar', nargs='?', default='d') >>> parser.parse_args(['XX', '--foo', 'YY']) Namespace(bar='XX', foo='YY') >>> parser.parse_args(['XX', '--foo']) Namespace(bar='XX', foo='c') >>> parser.parse_args([]) Namespace(bar='d', foo='d')Одно из наиболее распространённых применений
nargs='?'— это разрешение необязательных входных и выходных файлов:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), ... default=sys.stdin) >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), ... default=sys.stdout) >>> parser.parse_args(['input.txt', 'output.txt']) Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>) >>> parser.parse_args([]) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
-
'*'. Все аргументы командной строки, присутствующие в списке, будут собраны в список. Обратите внимание, что обычно не имеет смысла иметь более одного позиционного аргумента сnargs='*', но несколько необязательных аргументов сnargs='*'возможны. Например:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='*') >>> parser.add_argument('--bar', nargs='*') >>> parser.add_argument('baz', nargs='*') >>> parser.parse_args('a b --foo x y --bar 1 2'.split()) Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
-
'+'. Также как и'*', все присутствующие аргументы командной строки собираются в список. Кроме того, будет выведено сообщение об ошибке, если не присутствовал хотя бы один аргумент командной строки. Например:>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', nargs='+') >>> parser.parse_args(['a', 'b']) Namespace(foo=['a', 'b']) >>> parser.parse_args([]) usage: PROG [-h] foo [foo ...] PROG: error: the following arguments are required: foo
Если ключевой аргумент nargs не указан, количество потребляемых аргументов определяется действием. В целом это означает, что будет потреблён один аргумент командной строки, и будет произведён один элемент (не список).
const
Аргумент const метода add_argument() используется для хранения постоянных значений, которые не считываются из командной строки, но требуются для различных действий ArgumentParser. Два наиболее распространённых варианта использования:
- Когда метод
add_argument()вызывается с параметрамиaction='store_const'илиaction='append_const'. Эти действия добавляют значениеconstв одно из свойств объекта, возвращаемого методомparse_args(). Примеры см. в описании параметра action. - Когда метод
add_argument()вызывается со строками параметров (например,-fили--foo) иnargs='?'. Это создаёт необязательный аргумент, за которым может следовать ноль или один аргумент командной строки. При разборе командной строки, если встречена строка параметра без последующего аргумента командной строки, используется значениеconstпо умолчанию. Примеры см. в описании параметра nargs.
Для действий 'store_const' и 'append_const' аргумент const должен быть указан. Для других действий он имеет значение по умолчанию None.
default
Некоторые необязательные и некоторые позиционные аргументы могут быть опущены в командной строке. Аргумент default метода add_argument(), значение которого по умолчанию None, определяет, какое значение должно использоваться, если аргумент командной строки отсутствует. Для необязательных аргументов используется значение default, если строка параметра отсутствует в командной строке:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
Если в целевом пространстве имён уже задано свойство, действие default не перепишет его:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))
Namespace(foo=101)
Если значение default является строкой, парсер анализирует значение так, как если бы это был аргумент командной строки. В частности, парсер применяет любой заданный аргумент преобразования type, прежде чем установить атрибут в возвращаемом значении Namespace. В противном случае парсер использует значение как есть:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--length', default='10', type=int)
>>> parser.add_argument('--width', default=10.5, type=int)
>>> parser.parse_args()
Namespace(length=10, width=10.5)
Для позиционных аргументов с nargs, равным ? или *, используется значение default, если аргумент командной строки отсутствует:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
Указание default=argparse.SUPPRESS не добавляет атрибута, если аргумент командной строки отсутствует:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=argparse.SUPPRESS)
>>> parser.parse_args([])
Namespace()
>>> parser.parse_args(['--foo', '1'])
Namespace(foo='1')
type
По умолчанию парсер считывает аргументы командной строки как простые строки. Однако часто строку из командной строки следует интерпретировать как другой тип, такой как float или int. Аргумент type метода add_argument() позволяет выполнить необходимые проверки типа и преобразования типов.
Если аргумент type используется с аргументом default, преобразователь типов применяется только в том случае, если значение по умолчанию является строкой.
Аргумент для type может быть любым вызываемым объектом, принимающим одну строку. Если функция вызывает ArgumentTypeError, TypeError или ValueError, исключение обрабатывается, и отображается сообщение об ошибке с красивым форматированием. Другие типы исключений не обрабатываются.
В качестве преобразователей типов можно использовать стандартные типы и функции:
import argparse
import pathlib
parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('source_file', type=open)
parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))
parser.add_argument('datapath', type=pathlib.Path)
Также можно использовать пользовательские функции:
>>> def hyphenated(string):
... return '-'.join([word[:4] for word in string.casefold().split()])
...
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('short_title', type=hyphenated)
>>> parser.parse_args(['"The Tale of Two Cities"'])
Namespace(short_title='"the-tale-of-two-citi')
Функция bool() не рекомендуется в качестве преобразователя типов. Она просто преобразует пустые строки в False и непустые строки в True. Это обычно не то, что требуется.
В общем случае аргумент type является удобством, которое следует использовать только для простых преобразований, которые могут вызвать только одно из трёх поддерживаемых исключений. Любые операции с более сложной обработкой ошибок или управлением ресурсами следует выполнять после разбора аргументов.
Например, преобразования JSON или YAML имеют сложные случаи ошибок, требующие более подробного сообщения об ошибке, чем можно получить с помощью аргумента type. JSONDecodeError не будет отформатирован должным образом, а исключение FileNotFound не будет обработано.
Даже FileType имеет ограничения для использования с аргументом type. Если один аргумент использует FileType, а последующий аргумент терпит неудачу, об ошибке сообщается, но файл автоматически не закрывается. В этом случае лучше подождать, пока парсер не выполнится, а затем использовать инструкцию with для управления файлами.
Для проверок типов, которые просто проверяют набор фиксированных значений, используйте аргумент choices вместо этого.
choices
Некоторые аргументы командной строки должны выбираться из ограниченного набора значений. Это можно сделать, передав последовательность объектов в качестве аргумента choices методу add_argument(). При разборе командной строки значения аргументов проверяются, и если аргумент не совпадает ни с одним из допустимых значений, выводится сообщение об ошибке:
>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
Обратите внимание, что проверка на наличие в последовательности choices выполняется после любых преобразований типа type. Поэтому типы объектов в последовательности choices должны соответствовать типу, указанному в type:
>>> parser = argparse.ArgumentParser(prog='doors.py')
>>> parser.add_argument('door', type=int, choices=range(1, 4))
>>> print(parser.parse_args(['3']))
Namespace(door=3)
>>> parser.parse_args(['4'])
usage: doors.py [-h] {1,2,3}
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)
В качестве значения choices может быть передана любая последовательность, включая объекты list, tuple и пользовательские последовательности.
Использование enum.Enum не рекомендуется, так как трудно управлять его отображением в справке, сообщениях об ошибках и использовании.
Форматирование аргументов выбора переопределяет значение по умолчанию metavar, которое обычно выводится из dest. Это обычно то, что вам нужно, так как пользователь никогда не видит параметр dest. Если это отображение нежелательно (возможно, из-за большого количества вариантов), укажите явное значение metavar.
required
В модуле argparse по умолчанию флаги, такие как -f и --bar, считаются необязательными аргументами, которые можно опустить в командной строке. Чтобы сделать параметр обязательным, аргумент True может быть задан для параметра required= метода add_argument():
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: [-h] --foo FOO
: error: the following arguments are required: --foo
Как показано в примере, если параметр отмечен как required, метод parse_args() сообщит об ошибке, если этот параметр отсутствует в командной строке.
Примечание
Обязательные параметры обычно считаются плохой формой, так как пользователи ожидают, что параметры будут необязательными, поэтому их следует избегать, когда это возможно.
help
Параметр help — это строка, содержащая краткое описание аргумента. Когда пользователь запрашивает справку (обычно используя -h или --help в командной строке), эти описания help аргументов отображаются:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', action='store_true',
... help='foo the bars before frobbling')
>>> parser.add_argument('bar', nargs='+',
... help='one of the bars to be frobbled')
>>> parser.parse_args(['-h'])
usage: frobble [-h] [--foo] bar [bar ...]
positional arguments:
bar one of the bars to be frobbled
options:
-h, --help show this help message and exit
--foo foo the bars before frobbling
В строках справки можно использовать различные спецификаторы формата, чтобы избежать повторения таких вещей, как имя программы или значение аргумента default. Доступные спецификаторы включают имя программы, %(prog)s и большинство ключевых аргументов метода add_argument(), например, %(default)s, %(type)s, и так далее:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('bar', nargs='?', type=int, default=42,
... help='the bar to %(prog)s (default: %(default)s)')
>>> parser.print_help()
usage: frobble [-h] [bar]
positional arguments:
bar the bar to frobble (default: 42)
options:
-h, --help show this help message and exit
Так как строка справки поддерживает %-форматирование, если вам нужна буквальная %, вы должны экранировать её как %%.
Модуль argparse поддерживает отключение записи справки для определённых параметров, установив значение help в argparse.SUPPRESS:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', help=argparse.SUPPRESS)
>>> parser.print_help()
usage: frobble [-h]
options:
-h, --help show this help message and exit
metavar
Когда ArgumentParser генерирует сообщения справки, ему нужно как-то сослаться на каждый ожидаемый аргумент. По умолчанию объекты ArgumentParser используют значение dest в качестве «имени» каждого объекта. По умолчанию, для позиционных аргументов используется значение dest напрямую, а для необязательных аргументов – значение dest в верхнем регистре. Таким образом, единственный позиционный аргумент с dest='bar' будет упоминаться как bar. Единственный необязательный аргумент --foo , за которым должен следовать один аргумент командной строки, будет упоминаться как FOO. Пример:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo FOO] bar
positional arguments:
bar
options:
-h, --help show this help message and exit
--foo FOO
Альтернативное имя может быть указано с помощью metavar:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo YYY] XXX
positional arguments:
XXX
options:
-h, --help show this help message and exit
--foo YYY
Обратите внимание, что metavar изменяет только отображаемое имя — имя атрибута в объекте parse_args() всё ещё определяется значением dest.
Разные значения nargs могут привести к тому, что metavar будет использоваться несколько раз. Передача кортежа в metavar определяет различное отображение для каждого из аргументов:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]
options:
-h, --help show this help message and exit
-x X X
--foo bar baz
dest
Большинство действий ArgumentParser добавляют некоторое значение в качестве атрибута объекта, возвращаемого функцией parse_args(). Имя этого атрибута определяется ключевым аргументом add_argument(). Для позиционных действий аргумента, dest обычно передаётся в качестве первого аргумента к add_argument():
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args(['XXX'])
Namespace(bar='XXX')
Для необязательных действий аргумента, значение dest обычно определяется из строк опций. ArgumentParser генерирует значение dest, беря первую длинную строку опции и удаляя начальную строку --. Если не было указано ни одной длинной строки опции, значение dest будет получено из первой короткой строки опции, удаляя начальный символ - . Любые внутренние символы - будут преобразованы в символы _ , чтобы гарантировать, что строка является допустимым именем атрибута. Примеры ниже иллюстрируют это поведение:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')
dest позволяет указать имя атрибута:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
Классы действий
Классы действий реализуют API действий, вызываемый объект, который возвращает вызываемый объект, обрабатывающий аргументы из командной строки. Любой объект, соответствующий этому API, может быть передан в качестве параметра action функции add_argument().
-
class argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)
Объекты действий используются ArgumentParser для представления информации, необходимой для анализа одного аргумента из одной или нескольких строк командной строки. Класс Action должен принимать два позиционных аргумента плюс любые ключевые аргументы, переданные функции ArgumentParser.add_argument() за исключением самого action.
Экземпляры Action (или возвращаемое значение любого вызываемого объекта для параметра action ) должны иметь определённые атрибуты «dest», «option_strings», «default», «type», «required», «help» и т.д. Самый простой способ гарантировать, что эти атрибуты определены, — это вызвать Action.__init__.
Объекты Action должны быть вызываемыми, поэтому подклассы должны переопределить метод __call__, который должен принимать четыре параметра:
-
parser- Объект ArgumentParser, содержащий это действие. -
namespace- ОбъектNamespace, который будет возвращён функциейparse_args(). Большинство действий добавляют атрибут в этот объект, используяsetattr(). -
values- Аргументы командной строки, с применением любых преобразований типов. Преобразования типов задаются ключевым аргументом type к функцииadd_argument(). -
option_string- Строка опции, которая была использована для вызова этого действия. Аргументoption_stringявляется необязательным и будет отсутствовать, если действие связано с позиционным аргументом.
Метод __call__ может выполнять произвольные действия, но обычно устанавливает атрибуты в объекте namespace на основе dest и values.
Подклассы Action могут определить метод format_usage, который не принимает аргументов и возвращает строку, которая будет использоваться при печати использования программы. Если такой метод не предоставлен, будет использоваться разумный по умолчанию.
Метод parse_args()
-
ArgumentParser.parse_args(args=None, namespace=None) -
Преобразует строки аргументов в объекты и присваивает их как атрибуты пространства имен. Возвращает заполненное пространство имен.
Предыдущие вызовы
add_argument()определяют, какие именно объекты будут созданы и как они будут присвоены. Смотрите документацию дляadd_argument()для получения подробностей.
Синтаксис значения опции
Метод parse_args() поддерживает несколько способов указания значения опции (если она его принимает). В простейшем случае опция и ее значение передаются как два отдельных аргумента:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-x', 'X'])
Namespace(foo=None, x='X')
>>> parser.parse_args(['--foo', 'FOO'])
Namespace(foo='FOO', x=None)
Для длинных опций (опции с именами длиннее одного символа) опция и значение также могут быть переданы в виде одного аргумента командной строки, используя = для разделения:
>>> parser.parse_args(['--foo=FOO']) Namespace(foo='FOO', x=None)
Для коротких опций (опции длиной всего один символ) опция и ее значение могут быть объединены:
>>> parser.parse_args(['-xX']) Namespace(foo=None, x='X')
Несколько коротких опций могут быть объединены вместе, используя только один - префикс, если только последняя опция (или ни одна из них) не требует значения:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_true')
>>> parser.add_argument('-z')
>>> parser.parse_args(['-xyzZ'])
Namespace(x=True, y=True, z='Z')
Неверные аргументы
Во время парсинга командной строки, parse_args() проверяет различные ошибки, включая неоднозначные опции, неверные типы, неверные опции, неправильное количество позиционных аргументов и т. д. При обнаружении такой ошибки он завершается и выводит ошибку вместе с сообщением об использовании:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', nargs='?')
>>> # invalid type
>>> parser.parse_args(['--foo', 'spam'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: argument --foo: invalid int value: 'spam'
>>> # invalid option
>>> parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: no such option: --bar
>>> # wrong number of arguments
>>> parser.parse_args(['spam', 'badger'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: extra arguments found: badger
Аргументы, содержащие -
Метод parse_args() пытается сообщать об ошибках, когда пользователь явно ошибается, но некоторые ситуации изначально неоднозначны. Например, аргумент командной строки -1 может быть попыткой указать опцию или попыткой предоставить позиционный аргумент. Метод parse_args() здесь осторожен: позиционные аргументы могут начинаться только с - , если они похожи на отрицательные числа, и в парсере нет опций, похожих на отрицательные числа:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')
>>> # no negative number options, so -1 is a positional argument
>>> parser.parse_args(['-x', '-1'])
Namespace(foo=None, x='-1')
>>> # no negative number options, so -1 and -5 are positional arguments
>>> parser.parse_args(['-x', '-1', '-5'])
Namespace(foo='-5', x='-1')
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-1', dest='one')
>>> parser.add_argument('foo', nargs='?')
>>> # negative number options present, so -1 is an option
>>> parser.parse_args(['-1', 'X'])
Namespace(foo=None, one='X')
>>> # negative number options present, so -2 is an option
>>> parser.parse_args(['-2'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: no such option: -2
>>> # negative number options present, so both -1s are options
>>> parser.parse_args(['-1', '-1'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: argument -1: expected one argument
Если у вас есть позиционные аргументы, которые должны начинаться с - и не похожи на отрицательные числа, вы можете вставить псевдоаргумент '--' , который сообщает parse_args(), что все после этого — позиционные аргументы:
>>> parser.parse_args(['--', '-f']) Namespace(foo='-f', one=None)
Сокращения аргументов (сопоставление по префиксу)
Метод parse_args() по умолчанию позволяет сокращать длинные опции до префикса, если сокращение недвусмысленно (префикс соответствует уникальной опции):
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
usage: PROG [-h] [-bacon BACON] [-badger BADGER]
PROG: error: ambiguous option: -ba could match -badger, -bacon
Ошибка генерируется для аргументов, которые могут привести к нескольким опциям. Эта функция может быть отключена, установив allow_abbrev в значение False.
Выход за пределы sys.argv
Иногда может быть полезно, чтобы ArgumentParser парсил аргументы, отличные от тех, что в sys.argv. Это можно сделать, передав список строк методу parse_args(). Это полезно для тестирования в интерактивном режиме:
>>> parser = argparse.ArgumentParser() >>> parser.add_argument( ... 'integers', metavar='int', type=int, choices=range(10), ... nargs='+', help='an integer in the range 0..9') >>> parser.add_argument( ... '--sum', dest='accumulate', action='store_const', const=sum, ... default=max, help='sum the integers (default: find the max)') >>> parser.parse_args(['1', '2', '3', '4']) Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4]) >>> parser.parse_args(['1', '2', '3', '4', '--sum']) Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])
Объект Namespace
-
class argparse.Namespace -
Простой класс, используемый по умолчанию методом
parse_args()для создания объекта, хранящего атрибуты, и возврата его.
Этот класс преднамеренно прост, это просто подкласс object с удобочитаемым строковым представлением. Если вы предпочитаете иметь представление об атрибутах в виде словаря, вы можете использовать стандартный питоновский приём vars():
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
{'foo': 'BAR'}
Также может быть полезно, чтобы ArgumentParser присваивал атрибуты уже существующему объекту, а не новому объекту Namespace. Это можно сделать, указав ключевой аргумент namespace=:
>>> class C:
... pass
...
>>> c = C()
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)
>>> c.foo
'BAR'
Другие утилиты
Подкоманды
-
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_strings][, dest][, required][, help][, metavar]) -
Многие программы разбивают свою функциональность на множество подкоманд, например, программа
svnможет вызывать подкоманды, такие какsvn checkout,svn update, иsvn commit. Такое разделение функциональности может быть особенно полезно, когда программа выполняет несколько разных функций, требующих различных типов аргументов командной строки.ArgumentParserподдерживает создание таких подкоманд с помощью методаadd_subparsers(). Методadd_subparsers()обычно вызывается без аргументов и возвращает специальный объект действия. Этот объект имеет единственный метод,add_parser(), который принимает имя команды и любые аргументы конструктораArgumentParser, и возвращает объектArgumentParser, который можно модифицировать как обычно.Описание параметров:
- title - заголовок группы подпарсеров в выводе справки; по умолчанию «подкоманды», если описание предоставлено, в противном случае используется заголовок для позиционных аргументов
- description - описание группы подпарсеров в выводе справки, по умолчанию
None - prog - информация об использовании, которая будет отображаться со справкой по подкомандам, по умолчанию имя программы и все позиционные аргументы перед аргументом подпарсера
- parser_class - класс, который будет использоваться для создания экземпляров подпарсеров, по умолчанию класс текущего парсера (например, ArgumentParser)
- действие - основной тип действия, которое будет выполнено, когда этот аргумент встретится в командной строке
-
dest - имя атрибута, под которым будет храниться имя подкоманды; по умолчанию
Noneи значение не сохраняется -
required - Требуется ли подкоманда, по умолчанию
False(добавлено в 3.7) -
help - справка для группы подпарсеров в выводе справки, по умолчанию
None -
metavar - строка, представляющая доступные подкоманды в справке; по умолчанию
Noneи представляет подкоманды в форме {cmd1, cmd2, ..}
Некоторые примеры использования:
>>> # create the top-level parser >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo', action='store_true', help='foo help') >>> subparsers = parser.add_subparsers(help='sub-command help') >>> >>> # create the parser for the "a" command >>> parser_a = subparsers.add_parser('a', help='a help') >>> parser_a.add_argument('bar', type=int, help='bar help') >>> >>> # create the parser for the "b" command >>> parser_b = subparsers.add_parser('b', help='b help') >>> parser_b.add_argument('--baz', choices='XYZ', help='baz help') >>> >>> # parse some argument lists >>> parser.parse_args(['a', '12']) Namespace(bar=12, foo=False) >>> parser.parse_args(['--foo', 'b', '--baz', 'Z']) Namespace(baz='Z', foo=True)Обратите внимание, что объект, возвращаемый методом
parse_args(), будет содержать только атрибуты для основного парсера и подпарсера, который был выбран командной строкой (и не любые другие подпарсеры). Так, в примере выше, при указании командыa, присутствуют только атрибутыfooиbar, а при указании командыb, присутствуют только атрибутыfooиbaz.Аналогично, при запросе сообщения справки от подпарсера, будет напечатана только справка для этого конкретного парсера. Сообщение справки не будет включать сообщения родительского парсера или парсеров-братьев. (Сообщение справки для каждой подкоманды подпарсера, однако, может быть предоставлено путем передачи аргумента
help=вadd_parser()как указано выше.)>>> parser.parse_args(['--help']) usage: PROG [-h] [--foo] {a,b} ... positional arguments: {a,b} sub-command help a a help b b help options: -h, --help show this help message and exit --foo foo help >>> parser.parse_args(['a', '--help']) usage: PROG a [-h] bar positional arguments: bar bar help options: -h, --help show this help message and exit >>> parser.parse_args(['b', '--help']) usage: PROG b [-h] [--baz {X,Y,Z}] options: -h, --help show this help message and exit --baz {X,Y,Z} baz helpМетод
add_subparsers()также поддерживает ключевые аргументыtitleиdescription. При наличии любого из них, команды подпарсеров будут отображаться в своей собственной группе в выводе справки. Например:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(title='subcommands', ... description='valid subcommands', ... help='additional help') >>> subparsers.add_parser('foo') >>> subparsers.add_parser('bar') >>> parser.parse_args(['-h']) usage: [-h] {foo,bar} ... options: -h, --help show this help message and exit subcommands: valid subcommands {foo,bar} additional helpКроме того,
add_parserподдерживает дополнительный аргументaliases, который позволяет нескольким строкам ссылаться на один и тот же подпарсер. В этом примере, как и вsvn,coиспользуется как сокращение дляcheckout:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers() >>> checkout = subparsers.add_parser('checkout', aliases=['co']) >>> checkout.add_argument('foo') >>> parser.parse_args(['co', 'bar']) Namespace(foo='bar')Один из особенно эффективных способов обработки подкоманд — это сочетание использования метода
add_subparsers()с вызовамиset_defaults()таким образом, чтобы каждый подпарсер знал, какую функцию Python он должен выполнить. Например:>>> # sub-command functions >>> def foo(args): ... print(args.x * args.y) ... >>> def bar(args): ... print('((%s))' % args.z) ... >>> # create the top-level parser >>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(required=True) >>> >>> # create the parser for the "foo" command >>> parser_foo = subparsers.add_parser('foo') >>> parser_foo.add_argument('-x', type=int, default=1) >>> parser_foo.add_argument('y', type=float) >>> parser_foo.set_defaults(func=foo) >>> >>> # create the parser for the "bar" command >>> parser_bar = subparsers.add_parser('bar') >>> parser_bar.add_argument('z') >>> parser_bar.set_defaults(func=bar) >>> >>> # parse the args and call whatever function was selected >>> args = parser.parse_args('foo 1 -x 2'.split()) >>> args.func(args) 2.0 >>> >>> # parse the args and call whatever function was selected >>> args = parser.parse_args('bar XYZYX'.split()) >>> args.func(args) ((XYZYX))Таким образом, вы можете позволить
parse_args()выполнить работу по вызову соответствующей функции после завершения анализа аргументов. Связывание функций с действиями таким образом обычно является самым простым способом обработки различных действий для каждого из ваших подпарсеров. Однако, если необходимо проверить имя подпарсера, который был вызван, аргументdestк вызовуadd_subparsers()будет работать:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(dest='subparser_name') >>> subparser1 = subparsers.add_parser('1') >>> subparser1.add_argument('-x') >>> subparser2 = subparsers.add_parser('2') >>> subparser2.add_argument('y') >>> parser.parse_args(['2', 'frobble']) Namespace(subparser_name='2', y='frobble')Изменено в версии 3.7: Новый ключевой аргумент required.
Объекты FileType
-
class argparse.FileType(mode='r', bufsize=- 1, encoding=None, errors=None) -
Фабрика
FileTypeсоздает объекты, которые можно передавать в аргумент type методаArgumentParser.add_argument(). Аргументы, которые имеют объектыFileTypeв качестве своего типа, будут открывать аргументы командной строки как файлы с запрошенными режимами, размерами буфера, кодировками и обработкой ошибок (см. функциюopen()для получения дополнительной информации):>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--raw', type=argparse.FileType('wb', 0)) >>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8')) >>> parser.parse_args(['--raw', 'raw.dat', 'file.txt']) Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)Объекты FileType понимают псевдоаргумент
'-'и автоматически преобразуют его вsys.stdinдля читаемых объектовFileTypeиsys.stdoutдля записываемых объектовFileType:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', type=argparse.FileType('r')) >>> parser.parse_args(['-']) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)Добавлено в версии 3.4: Ключевые аргументы encodings и errors.
Группы аргументов
-
ArgumentParser.add_argument_group(title=None, description=None) -
По умолчанию
ArgumentParserгруппирует аргументы командной строки в «позиционные аргументы» и «дополнительные аргументы» при отображении сообщений справки. Когда существует лучшая концептуальная группировка аргументов, чем эта по умолчанию, соответствующие группы могут быть созданы с помощью методаadd_argument_group():>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group = parser.add_argument_group('group') >>> group.add_argument('--foo', help='foo help') >>> group.add_argument('bar', help='bar help') >>> parser.print_help() usage: PROG [--foo FOO] bar group: bar bar help --foo FOO foo helpМетод
add_argument_group()возвращает объект группы аргументов, который имеет методadd_argument(), как и обычныйArgumentParser. Когда аргумент добавляется в группу, парсер обрабатывает его так же, как и обычный аргумент, но отображает аргумент в отдельной группе для сообщений справки. Методadd_argument_group()принимает аргументы title и description, которые могут быть использованы для настройки этого отображения:>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group1 = parser.add_argument_group('group1', 'group1 description') >>> group1.add_argument('foo', help='foo help') >>> group2 = parser.add_argument_group('group2', 'group2 description') >>> group2.add_argument('--bar', help='bar help') >>> parser.print_help() usage: PROG [--bar BAR] foo group1: group1 description foo foo help group2: group2 description --bar BAR bar helpОбратите внимание, что все аргументы, которые не входят в ваши пользовательские группы, попадут обратно в обычные разделы «позиционные аргументы» и «дополнительные аргументы».
Взаимоисключение
-
ArgumentParser.add_mutually_exclusive_group(required=False) -
Создать группу взаимного исключения.
argparseгарантирует, что только один из аргументов в группе взаимного исключения был присутствующим в командной строке:>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_mutually_exclusive_group() >>> group.add_argument('--foo', action='store_true') >>> group.add_argument('--bar', action='store_false') >>> parser.parse_args(['--foo']) Namespace(bar=True, foo=True) >>> parser.parse_args(['--bar']) Namespace(bar=False, foo=False) >>> parser.parse_args(['--foo', '--bar']) usage: PROG [-h] [--foo | --bar] PROG: error: argument --bar: not allowed with argument --fooМетод
add_mutually_exclusive_group()также принимает аргумент required, чтобы указать, что по крайней мере один из взаимно исключающих аргументов необходим:>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_mutually_exclusive_group(required=True) >>> group.add_argument('--foo', action='store_true') >>> group.add_argument('--bar', action='store_false') >>> parser.parse_args([]) usage: PROG [-h] (--foo | --bar) PROG: error: one of the arguments --foo --bar is requiredОбратите внимание, что в настоящее время группы взаимно исключающих аргументов не поддерживают аргументы title и description метода
add_argument_group().
Значения по умолчанию для парсера
-
ArgumentParser.set_defaults(**kwargs) -
Большинство атрибутов объекта, возвращаемого методом
parse_args(), полностью определяются на основе аргументов командной строки и действий аргументов. Методset_defaults()позволяет добавить дополнительные атрибуты, значения которых определяются без проверки командной строки:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('foo', type=int) >>> parser.set_defaults(bar=42, baz='badger') >>> parser.parse_args(['736']) Namespace(bar=42, baz='badger', foo=736)Обратите внимание, что значения по умолчанию на уровне парсера всегда переопределяют значения по умолчанию на уровне аргумента:
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='bar') >>> parser.set_defaults(foo='spam') >>> parser.parse_args([]) Namespace(foo='spam')Значения по умолчанию на уровне парсера особенно полезны при работе с несколькими парсерами. Пример использования см. в методе
add_subparsers().
-
ArgumentParser.get_default(dest) -
Получить значение по умолчанию для атрибута пространства имен, заданное либо методом
add_argument(), либо методомset_defaults():>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='badger') >>> parser.get_default('foo') 'badger'
Вывод справки
В большинстве типичных приложений метод parse_args() отвечает за форматирование и вывод сообщений об использовании или об ошибках. Однако доступны несколько методов форматирования:
-
ArgumentParser.print_usage(file=None) -
Вывести краткое описание того, как следует вызывать
ArgumentParserв командной строке. Если file не указано, предполагаетсяsys.stdout.
-
ArgumentParser.print_help(file=None) -
Вывести сообщение справки, включая описание использования программы и информацию об аргументах, зарегистрированных в
ArgumentParser. Если file не указано, предполагаетсяsys.stdout.
Также существуют варианты этих методов, которые просто возвращают строку вместо вывода:
-
ArgumentParser.format_usage() -
Возвращает строку, содержащую краткое описание того, как следует вызывать
ArgumentParserв командной строке.
-
ArgumentParser.format_help() -
Возвращает строку, содержащую сообщение справки, включая описание использования программы и информацию об аргументах, зарегистрированных в
ArgumentParser.
Частичный разбор
-
ArgumentParser.parse_known_args(args=None, namespace=None)
Иногда сценарию требуется обработать только часть аргументов командной строки, передавая оставшиеся аргументы другой скрипту или программе. В таких случаях может быть полезен метод parse_known_args(). Он работает почти так же, как parse_args(), но не генерирует ошибку при наличии дополнительных аргументов. Вместо этого он возвращает кортеж из двух элементов: заполненное пространство имён и список оставшихся аргументов.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
Предупреждение
Правила сопоставления по префиксу применяются к parse_known_args(). Парсер может использовать опцию, даже если она является лишь префиксом одной из известных опций, вместо того, чтобы оставить её в списке оставшихся аргументов.
Настройка разбора из файлов
-
ArgumentParser.convert_arg_line_to_args(arg_line) -
Аргументы, считанные из файла (см. ключевой аргумент fromfile_prefix_chars конструктора
ArgumentParser), считываются по одному аргументу на строку. Методconvert_arg_line_to_args()может быть переопределён для более сложного чтения.Этот метод принимает один аргумент arg_line, который представляет собой строку, считанную из файла аргументов. Он возвращает список аргументов, разобранных из этой строки. Метод вызывается один раз на каждую строку, считанную из файла аргументов, в порядке.
Полезное переопределение этого метода — такое, которое обрабатывает каждое слово, разделённое пробелом, как аргумент. Следующий пример демонстрирует, как это сделать:
class MyArgumentParser(argparse.ArgumentParser): def convert_arg_line_to_args(self, arg_line): return arg_line.split()
Методы завершения
-
ArgumentParser.exit(status=0, message=None) -
Этот метод завершает программу, завершая её с указанным status и, если указано, выводя message перед этим. Пользователь может переопределить этот метод, чтобы обработать эти шаги по-другому:
class ErrorCatchingArgumentParser(argparse.ArgumentParser): def exit(self, status=0, message=None): if status: raise Exception(f'Exiting because of an error: {message}') exit(status)
-
ArgumentParser.error(message) -
Этот метод выводит сообщение об использовании, включая message, в стандартный поток ошибок и завершает программу с кодом состояния 2.
Смешанный разбор
-
ArgumentParser.parse_intermixed_args(args=None, namespace=None)
-
ArgumentParser.parse_known_intermixed_args(args=None, namespace=None)
Ряд команд Unix позволяет пользователю смешивать необязательные аргументы с позиционными. Методы parse_intermixed_args() и parse_known_intermixed_args() поддерживают этот стиль разбора.
Эти парсеры не поддерживают все функции argparse и будут генерировать исключения, если будут использоваться недоступные функции. В частности, подпарсеры, argparse.REMAINDER, и группы взаимоисключающих аргументов, включающие как необязательные, так и позиционные аргументы, не поддерживаются.
Следующий пример показывает разницу между parse_known_args() и parse_intermixed_args(): первый возвращает ['2',
'3'] в качестве необработанных аргументов, а второй собирает все позиционные аргументы в rest.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('cmd')
>>> parser.add_argument('rest', nargs='*', type=int)
>>> parser.parse_known_args('doit 1 --foo bar 2 3'.split())
(Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3'])
>>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split())
Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])
Метод parse_known_intermixed_args() возвращает кортеж из двух элементов: заполненное пространство имен и список оставшихся аргументов. Метод parse_intermixed_args() вызывает ошибку, если существуют необработанные аргументы.
Введено в версии 3.7.
Обновление кода optparse
Изначально модуль argparse пытался сохранить совместимость с модулем optparse. Однако optparse было сложно прозрачно расширять, особенно с изменениями, необходимыми для поддержки новых спецификаторов nargs= и улучшенных сообщений об использовании. Когда большая часть кода optparse была либо скопирована, либо произведено мошенническое исправление, уже не казалось целесообразным пытаться сохранить обратную совместимость.
Модуль argparse улучшает модуль optparse стандартной библиотеки по нескольким параметрам, включая:
- Обработку позиционных аргументов.
- Поддержку подкоманд.
- Возможность альтернативных префиксов опций, таких как
+и/. - Обработку аргументов типа "ноль или более" и "один или более".
- Генерацию более информативных сообщений об использовании.
- Предоставление гораздо более простого интерфейса для пользовательских
typeиaction.
Частичный путь обновления с optparse на argparse:
- Замените все вызовы
optparse.OptionParser.add_option()на вызовыArgumentParser.add_argument(). - Замените
(options, args) = parser.parse_args()наargs = parser.parse_args()и добавьте дополнительные вызовыArgumentParser.add_argument()для позиционных аргументов. Имейте в виду, что то, что раньше называлосьoptions, теперь в контекстеargparseназываетсяargs. - Замените
optparse.OptionParser.disable_interspersed_args()на использованиеparse_intermixed_args()вместоparse_args(). - Замените действия обратного вызова и ключевые аргументы
callback_*на аргументыtypeилиaction. - Замените строковые имена ключевых аргументов
typeна соответствующие объекты типов (например, int, float, complex и т. д.). - Замените
optparse.ValuesнаNamespaceиoptparse.OptionErrorиoptparse.OptionValueErrorнаArgumentError. - Замените строки с неявными аргументами, такими как
%defaultили%prog, на стандартный синтаксис Python для использования словарей для форматирования строк, то есть,%(default)sи%(prog)s. - Замените аргумент конструктора OptionParser
versionна вызовparser.add_argument('--version', action='version', version='<the version>').
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/argparse.html