Я использую Argparser для обработки аргументов для моей прошивки CLI. Но по прошествии времени я думаю, что это не очень хорошая идея. Здесь возникает проблема. Я хочу использовать параметры без символа префикса. Подобно git commit или svn move. Я немного искал и обнаружил, что у Argparse есть метод add_subparser(). Давайте заселить наш Foo прогу:Есть ли способ установить параметры без префикса в Argparser?
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
Пусть теперь выполнить Foo с опциями и печати args
имен (я не сделал в прошлом весь код, вы получите точку):
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
Как вы видите, если я исполню опцию del
, , то добавление_проекта не передается переменной args
. Это вызывает проблемы, если у меня есть «если условие» в моей главной функции() как
def main(args):
if args.delete_project:
...
if args.add_project:
...
Я получаю исключение AttributeError, что пространство имен не имеет атрибута с именем add_project если я исполняю ./foo del
. Кроме того, я не могу передать какие-либо аргументы опциям del
и add
. Я также установил prefix_chars в пустую строку, которая тоже не работала.
Что такое способ его обработки? Является ли argparse способным создавать такие параметры, как git, svn и т. Д., Или я должен создать свою собственную функцию и самостоятельно обрабатывать все аргументы?
Это абсолютно так.OP получает ошибки атрибутов на подпараметрах, которые пользователь не вызывал, и я объяснил ему, как смотреть на подпараметр, который был фактически использован. – Tobu
Ба, моя ошибка, я полностью пропустил 'subparser'. –
@ Ник Хе. Это было немного немного, я оставляю объяснение. – Tobu