2017-04-03 7 views
0

나는 utility을 가지고있어서 사용자가 자신의 ~/.aws/credentials 파일을 읽고 환경 변수를 내보낼 수 있습니다.선택적 서브 parser?

현재 CLI 인터페이스는 다음과 같습니다 : 내가 여기서 뭘하고 싶은 무엇

usage: aws-env [-h] [-n] profile 

Extract AWS credentials for a given profile as environment variables. 

positional arguments: 
    profile   The profile in ~/.aws/credentials to extract credentials 
        for. 

optional arguments: 
    -h, --help  show this help message and exit 
    -n, --no-export Do not use export on the variables. 

는 사용자가 자신의 ~/.aws/credentials에 유효한 프로필 이름을 나열 할 수 있도록하는 ls subparser을 제공합니다.

$ aws-env ls 
profile-1 
profile-2 

... 등등 :

인터페이스는 다음과 같이 될 것이다. 거기에 옵션을 내 -h 출력을 ls 유효한 명령을 나타내는 나타납니다 그래서 argparse이 기본적으로 할 수있는 방법이 있나요?

+0

당신이 실제로 추가 봤어 서브 파서? https://docs.python.org/3/library/argparse.html#sub-commands – jonrsharpe

+0

'ls' 명령에 대해 하나의 서브 파서가 필요하며 단일 프로필 이름과 일치하는 일반 서브 파서가 필요합니다. 그게 가능하니? –

+0

시도해 보셨습니까? 어떻게 된 거예요? 어떤 연구를합니까? 예 : http://stackoverflow.com/q/8668519/3001761 – jonrsharpe

답변

1

subparsers 경로를 사용하면 두 개의 파서 'ls'와 'extract'를 정의 할 수 있습니다. 'ls'는 인수가 없습니다. '추출'은 '프로필'이라는 위치를 취합니다.

subparsers는 선택 사항이지만 (Argparse with required subparser), '프로필'은 현재 정의 된대로 필요합니다.

다른 대안은 두 개의 옵션을 정의하고 위치를 생략하는 것입니다.

'-ls', True/False, if True to the list 
'-e profile', if not None, do the extract. 

아니면 위치 profile두고 있지만 (= nargs '?')이 옵션을 만들 수 있습니다.

또 다른 가능성은 구문 분석 후 profile 값을 보는 것입니다. 'ls'와 같은 문자열이면 extract 대신 나열하십시오. 이것은 가장 깨끗한 선택처럼 느껴지지만 사용법에서는이를 문서화하지 않습니다.


parser.add_argument('-l','--ls', action='store_true', help='list') 
parser.add_argument('profile', nargs='?', help='The profile') 

또는

sp = parser.add_subparsers(dest='cmd') 
sp.add_parser('ls') 
sp1 = sp.add_parser('extract') 
sp1.add_argument('profile', help='The profile') 

필수 상호 배타적 인 그룹은

gp = parser.add_mutually_exclusive_group(required=True) 
gp.add_argument('--ls', action='store_true', help='list') 
gp.add_argument('profile', nargs='?', default='adefault', help='The profile') 

생산 :

usage: aws-env [-h] [-n] (--ls | profile) 
+0

TL; DR 실제로 가능한 것은 아니지만 해결 방법이 있습니다. –