2015-04-14 4 views
1

При запуске скрипта вы должны пройти либо -g, либо -s. С помощью приведенного ниже кода он выдает следующую ошибку с переданными ей аргументами.Python - argparse требуется либо либо

{~/nsnitro}-> ./sg-arg.py status -g test.server 
usage: sg-arg.py [-h] (-g SERVICEGROUP | -s SERVICENAME) {status} ... 
sg-arg.py: error: one of the arguments -g/--servicegroup -s/--servicename is required 

Код:

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers() 

check = subparsers.add_parser('status') 
check = parser.add_mutually_exclusive_group(required=True) 
check.add_argument('-g', '--servicegroup', action='store', help='servicegroup name', type=servicegroup_status) 
check.add_argument('-s', '--servicename', action='store', help='service name', type=servicegroup_status) 

args = parser.parse_args() 
+1

Похоже, вы добавляете взаимоисключающую группу к мастер-синтаксическому анализатору, а не к подпараметру. например './sg-arg.py -g test.server status' был бы правильным вызовом в этом случае, я думаю. – mgilson

ответ

1

Вы хотите добавить взаимоисключающую группу к неправильному анализатору. Другими словами, с вашим вызовом правильный вызов будет примерно ./sg-arg.py -g test.server status (обратите внимание, что аргумент приходит до декларация подпараметра).

Чтобы исправить это, вы должны добавить группу взаимного исключения в подпараметр и добавить аргументы в эту группу. Это, как представляется, работает:

import argparse 
parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers() 

check = subparsers.add_parser('status') 
check_mutex = check.add_mutually_exclusive_group(required=True) 
check_mutex.add_argument('-g', '--servicegroup', action='store', help='servicegroup name') 
check_mutex.add_argument('-s', '--servicename', action='store', help='service name') 

args = parser.parse_args() 

e.g.

$ python foo.py status -g test.server 
$ python foo.py status -s test.server 
$ python foo.py status test.server 
usage: foo.py status [-h] (-g SERVICEGROUP | -s SERVICENAME) 
foo.py status: error: one of the arguments -g/--servicegroup -s/--servicename is required 
+0

А я вижу, поэтому удаление 'type = servicegroup_status' нарушает код. Я на самом деле вызываю функцию под названием «servicegroup_status» и передаю аргументы. Скрипт работает нормально, но функция не вызывается. – luckytaxi

+0

Хорошо, я возвращаю его, функция выполняется, но все равно выдает ошибку, когда я добавляю статус 'type = FUNCTION_NAME'' sg-arg.py: ошибка: один из аргументов -g/- servicegroup -s/- требуется servicename' – luckytaxi

Смежные вопросы