2012-12-18 2 views
2
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument(
    '--optional', 
    default=None, 
    const='some-const', 
    nargs='?', 
    help='optional') 

subparsers = parser.add_subparsers() 

subparser = subparsers.add_parser('subparser') 

subparser.add_argument(
    'positional', 
    help='positional') 

args = parser.parse_args() 

print args 

./test.py --optional opt subparser positional 
Namespace(optional='opt', positional='positional') <-- works as expected 

./test.py --optional subparser positional 
usage: test.py [-h] [--optional [OPTIONAL]] {subparser} ... 
test.py: error: invalid choice: 'positional' (choose from 'subparser') <-- throws an error 
Namespace(optional='some-const', positional='positional') <-- would expect to see this 

위는이 문제를 보여주는 가장 간단한 테스트 코드입니다. nargs = '?'를 사용하는 선택적 인자를 갖고 싶습니다. 및 const 전에 subparser 내 위치 arg. 나는 원래 파서를 자식 하위 파서의 부모로 전달할 수 있다고 읽었지만 문제를 해결하지는 못합니다. 나는 add_help = False를 추가하고 conflict_handler = 'resolve'를 시도했을 때 초기 파서 선언에 시도했다. 아무도 이것에 올바른 방향으로 나를 가리킬 수 있습니까?nargs = '?'를 사용하는 argparse 옵션 arg before 하위 인수의 위치 arg

usage: subparser.py [-h] [--optional [OPTIONAL]] {subparser} ... 
test.py: error: too few arguments 

subparser가 먹고 두 번째 예에서 OPTIONAL으로 사용지고 : subparser이되지 않는 옵션 때문에

.test.py --optional 

:

감사합니다,

+0

왜 '--optional'을 서브 파서의 부모로 정의해도 문제가 해결되지 않습니까? 어쨌든'subparser'를 호출해야합니다. 그래서'- optional subparser POS' 또는'subparser POS -optional'이라면 어떤 차이가 있습니까? 나는 그것을 "버그"라고 부르기를 주저합니다. 그러나 문서를 읽거나 놀아 보면 내 기대에 어긋납니다 :) 그래도 주위를 해결할 수 있다면 ... –

+0

'subparser POS - optional' doesn ' 이 코드로 작업하십시오. – jgritty

답변

0

스콧이 오류가 발생합니다 . argparse가 subparser가 subparser라는 것을 미리 알아 내지 못하는 이유는 모르겠다.

import argparse 

parent_parser = argparse.ArgumentParser(add_help=False) 
parent_parser.add_argument(
    '--optional', 
    nargs='?', 
    default=None, 
    const='some-const', 
    help='optional') 

sub_parser = argparse.ArgumentParser(parents=[parent_parser]) 
sub_parser.add_argument('--subparser', required=True) 

args = sub_parser.parse_args() 

print args 

난 당신이 버그를 발견했다고 생각 :

이것은 당신이 설명하는 무엇을 만들 수있는 가장 가까운 것입니다.

0

./test.py --optional foo bar를 분석, argparse는 (시작 -) 선택적 문자열을 보는 두 개의 인수 문자열 (없음 -) 다음

은 그래서 --optional를 처리하여 시작합니다. 그것은 생산의 foo 인수를 소비 그래서, nargs는? '욕심'입니다입니다 :

bar
Namespace('optional'='foo') 

은 하위 명령 인수로 소비 될 수 있습니다.

foo이 유효한 하위 명령 인수인지 여부는 확인하지 않습니다.

동일한 추론이 ./test.py --optional subparser positional에 적용됩니다.