Требование аргумента командной строки, если указан необязательный аргумент - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь написать скрипт, в котором пользователь может выбрать один из трех вариантов:

python foo.py 
python foo.py -a
python foo.py -b address_arg data_arg

Если пользователь выберет последний вариант, он должен предоставить мне два дополнительных аргумента для адреса и данных..

В настоящее время он работает так, что ему требуется один аргумент, скажем, для адреса здесь:

parser.add_argument('-b', '--boo', dest='address', type=str, help="Help message")

, который работает, если я запускаю

python foo.py -b 0x00

Но кактребовать от пользователя предоставления второго аргумента для данных?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вы вводите дополнительный аргумент в подпрограмме action для -b.

. Там вы проверяете наличие и действительность ожидаемого значения data_arg.Только для существования достаточно выполнить простую проверку количества аргументов.

0 голосов
/ 19 сентября 2018

Вы можете установить количество ожидаемых аргументов с помощью nargs=2.

https://docs.python.org/3/library/argparse.html#the-add-argument-method

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-b', '--bar', nargs=2)
_StoreAction(option_strings=['-b', '--bar'], dest='bar', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> args = parser.parse_args(['--bar', 'arg1', 'arg2'])
>>> args.bar
['arg1', 'arg2']
>>> args = parser.parse_args(['--bar', 'arg1'])
usage: [-h] [-b BAR BAR]
: error: argument -b/--bar: expected 2 arguments

Обратите внимание, что здесь отображаемая справка показывает -b BAR BAR, что несколько раздражает (по умолчанию дублирует имя аргумента).Вы можете установить metavar в кортеж, чтобы лучше отображались справочные сообщения для двух передаваемых аргументов.

>>> parser.add_argument('-f', '--foo', nargs=2, metavar=('desc1', 'desc2'))
_StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=('desc1', 'desc2'))
>>> parser.print_help()
usage: [-h] [-b BAR BAR] [-f desc1 desc2]

optional arguments:
  -h, --help            show this help message and exit
  -b BAR BAR, --bar BAR BAR
  -f desc1 desc2, --foo desc1 desc2

Подробнее об этом см. Здесь: https://docs.python.org/3/library/argparse.html#metavar

...