2016-09-12 4 views
0

나는 내가 여러 subparsers 파이썬 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() 
..... 

나는 다음과 같은 얻을이 실행으로 이동

와 argparse 사용하고있는 다음 코드가 :

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

나는를 위의 코드가 잘못되어 있는지 궁금합니다. "action"인수는 위치 인수입니다.

미리 감사드립니다. 이것은 분명히 실수를 저지르고있는 서브 파서를 처음 사용하는 것입니다.

미리 감사드립니다.

감사합니다,

랑가

+0

왜 하위 파서에 대한 인수를 추가하고 있습니까? – mgilson

+0

빠른 답장을 보내 주셔서 감사합니다. 인수는 "drop"작업에만 의미가 있습니다. 다른 옵션의 경우 의미가 없으므로 서브 파서에 추가했습니다. 나는 명확성을 위해 다른 서브 파서를 생략했다. – LostInTheFrequencyDomain

+0

'action drop'을 추가해야 할 수도 있습니다. 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

관련 문제