python: argparse с необязательными аргументами командной строки - PullRequest
0 голосов
/ 17 января 2020

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

./app.py -E [optional arg] -T [optional arg]

Для сценария требуется хотя бы один из параметров: -E или -T

Что я должен передать в parser.add_argument чтобы иметь такую ​​функциональность?

ОБНОВЛЕНИЕ По некоторым причинам предлагаемое решение с add_mutually_exclusive_group не работало, когда я добавил атрибуты nargs='?' и const=:

parser = argparse.ArgumentParser(prog='PROG')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-F', '--foo', nargs='?', const='/tmp')
group.add_argument('-B', '--bar', nargs='?', const='/tmp')
parser.parse_args([])

Запуск от имени script.py -F по-прежнему выдает ошибку:

PROG: error: one of the arguments -F/--foo -B/--bar is required

Однако мне помог следующий обходной путь :

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-F', '--foo', nargs='?', const='/tmp')
parser.add_argument('-B', '--bar', nargs='?', const='/tmp')
args = parser.parse_args()

if (not args.foo and not args.bar) or (args.foo and args.bar):
   print('Must specify one of -F/-B options.')
   sys.exit(1)

if args.foo:
   foo_func(arg.foo)
elif args.bar:
   bar_func(args.bar)
...

1 Ответ

1 голос
/ 17 января 2020

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

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
parser.add_argument('--bar')

args = parser.parse_args()

if args.foo is None and args.bar is None:
   parser.error("please specify at least one of --foo or --bar")

Если вы хотите, чтобы присутствовал только один из двух аргументов, см. [add_mutually_exclusive_group] (https://docs.python.org/2/library/argparse.html#mutual - исключение ) с required=True

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