2016-09-12 2 views
0

У меня есть следующий фрагмент кода, где я использую argparse с несколькими subparsersPython argparse, позиционные аргументы и subparsers

parser = argparse.ArgumentParser(description = "Setup the DB", 
     add_help=False) 
parser.add_argument('action', type = str, 
     choices=['drop','populate','print','create','print-metadata'], 
     help = "Specify an action", default = None) 
subparsers = parser.add_subparsers() 
drop_parser = subparsers.add_parser('drop',parents=[parser]) 
drop_parser.add_argument('-dataset-name', 
     required=True, 
     type = str, help = "Dataset Name", 
     default = None) 
..... 
args = parser.parse_args() 
..... 

Когда я иду, чтобы запустить это я получаю следующее:

python .\populatedb.py drop -dataset-name foo 
populatedb.py: error: invalid choice: 'foo' (choose from 'drop', 'populate', 'print', 'create', 'print-metadata') 

Я интересно, где код выше идет не так. Обратите внимание, что аргумент «действие» является позиционным аргументом.

Заранее спасибо. Это мое первое использование подпараметров. Я, вероятно, делаю очевидную ошибку.

Заранее спасибо.

С уважением,

Ранга

+0

Почему вы добавляете аргумент для подпараметра? – mgilson

+0

Спасибо за быстрый ответ. Аргумент имеет смысл только для действия «drop». Для других вариантов это не имеет смысла, поэтому я добавил его в подпараметр. Для ясности я оставил других подпараметров. – LostInTheFrequencyDomain

+0

Похоже, вам может понадобиться добавить «падение действия». Вы можете запустить python populatedb.py -h, чтобы увидеть последовательность аргументов, которые вам нужно передать. –

ответ

0

Общепринятым вещь, чтобы сделать здесь, чтобы не иметь аргумент для subparser - это его собственный аргумент обеспечивается argparse:

parser = argparse.ArgumentParser(description = "Setup the DB", 
     add_help=False) 
subparsers = parser.add_subparsers() 
drop_parser = subparsers.add_parser('drop',parents=[parser]) 
drop_parser.add_argument('-dataset-name', 
     required=True, 
     type = str, help = "Dataset Name", 
     default = None) 
..... 
args = parser.parse_args() 

сейчас вы не обязательно знаете, какой парсер был выбран, но не волнуйтесь, есть встроенный механизм для этого. Один из распространенных вариантов использования оказывает одну функцию, которая должна вызываться для каждого subparser ...

parser = argparse.ArgumentParser(description = "Setup the DB", 
     add_help=False) 
subparsers = parser.add_subparsers() 

def drop_parser_handler(args): 
    ... 

drop_parser = subparsers.add_parser('drop',parents=[parser]) 
drop_parser.add_argument('-dataset-name', 
     required=True, 
     type = str, help = "Dataset Name", 
     default = None) 
drop_parser.set_defaults(func=drop_parser_handler) 
..... 

args = parser.parse_args() 
args.func(args) 

Конечно вам не нужно ничего делать этот комплекс - Вы можете просто установить постоянное значение:

drop_parser.set_defaults(subparser_name='drop') 
+0

Спасибо! Это помогло. – LostInTheFrequencyDomain

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