Python argparse: аргумент командной строки, который может быть как именованным, так и позиционным
Я пытаюсь сделать программу на Python, которая используетargparse
модуль для разбора параметров командной строки.
Я хочу сделать необязательный аргумент, который может быть именованным или позиционным. Например, я хочуmyScript --username=batman
сделать то же самое, что иmyScript batman
, Я также хочуmyScript
без имени пользователя, чтобы быть действительным. Это возможно? Если так, как это можно сделать?
Я пробовал разные вещи, похожие на код ниже, но безуспешно.
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin")
group.add_argument("user-name", default="admin")
args = parser.parse_args()
РЕДАКТИРОВАТЬ: Код выше выдает исключение, сказавValueError: mutually exclusive arguments must be optional
.
Я использую Python 2.7.2 на OS X 10.8.4.
РЕДАКТИРОВАТЬЯ попробовал предложение Габриэля Якобсона, но не смог заставить его работать правильно во всех случаях.
Я попробовал это:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin", nargs="?")
group.add_argument("user_name", default="admin", nargs="?")
args = parser.parse_args()
print(args)
и работаетmyScript batman
будет печататьNamespace(user_name='batman')
, ноmyScript -u batman
а такжеmyScript --user-name=batman
будет печататьNamespace(user_name='admin')
.
Я пытался изменить имяuser-name
вuser_name
в 1-мadd_argument
линия, и это иногда приводило как кbatman
а такжеadmin
в пространстве имен или ошибка, в зависимости от того, как я запустил программу.
Я пытался изменить имяuser_name
вuser-name
во второмadd_argument
линия, но это напечатало бы либоNamespace(user-name='batman', user_name='admin')
или жеNamespace(user-name='admin', user_name='batman')
в зависимости от того, как я запустил программу.