2010-07-13 5 views
1
에 argparse 사용하여 두 값으로 인수에 대해 별도의 선택을 설정

나는 현재 다음과 같은 코드가 있습니다 : 파이썬

import argparse 

parser = argparse.ArgumentParser(description='Adds a new modem to Iridium account') 
parser.add_argument('imei', metavar='I', nargs=1, help='the modems IMEI') 
parser.add_argument('-t1', '--type1', metavar='t1', nargs=1, choices=('email', 'directip', 'sbddevice'), default='directip', help='Call type (default: directip)') 
parser.add_argument('-a1', '--address1', metavar='a1', nargs=1, default='75.101.138.217:9097', help='Call address (default: 75.101.138.217:9097)') 
parser.add_argument('-t2', '--type2', metavar='t2', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a2', '--address2', metavar='a2', nargs=1, help='Call address') 
parser.add_argument('-t3', '--type3', metavar='t3', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a3', '--address3', metavar='a3', nargs=1, help='Call address') 
parser.add_argument('-t4', '--type4', metavar='t4', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a4', '--address4', metavar='a4', nargs=1, help='Call address') 
parser.add_argument('-t5', '--type5', metavar='t5', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a5', '--address5', metavar='a5', nargs=1, help='Call address') 

args = parser.parse_args() 

내가 말에 모든 -t 및 -a를 결합 할 수있는 방법이 있나요 -M1, -M2 , -m3, -m4, -m5 여기서 t는 아래의 동일한 선택 항목과 -a가 두 번째 인수이지만 첫 번째 값과 동일한 선택 항목에 국한되지 않는 인수의 첫 번째 값입니까? 당신이 이것을 할 수 있어야하는 것처럼 보입니다. 그렇지 않으면 나중에 t1과 a1이 있는지 확인하기 위해 나중에 검사해야합니다. 사용자가 하나를 제공하면 다른 하나를 제공해야하기 때문입니다.

그래서 그 대신이 도로 아래로 사람을 도움이 될 것입니다,하지만 난 알렉스가 제안하는 일을 결국 경우에 당신은 -m1 email [email protected]

+2

무엇보다 단순한'-M1 이메일에 대한 : 테스트 @의 gmail.com'을 대신뿐만 아니라 이메일 주소에 적용되는 것 때문에 nargs 매개 변수는 choices 함께 사용할 수 없습니다 분명이 알아서 할 수 있지만, ? 나는'argparse'를 쉽게 알지 못한다. (실행 가능하다면) 하나의 옵션에 대해 두 개의 인수를 넣는 것이 쉽지만 사용자로서 나는 이상한 파싱 행동에 놀랐을 것이다.'type : wh @ tever'는 내게 완벽하게 자연 스럽습니다. –

+0

정확히 5 개의 주소에 대한 제한은 조금 임의적으로 보입니다. 주소를 위치 인수로 사용하고 IMEI를 옵션으로 사용 하시겠습니까? – Philipp

+0

당신은'nargs = 2'와 함께 두 개의 args를 받아 들일 수 있고 그 다음에 출력을 파싱 할 수 있습니다 (여러분의'choices ='는 그걸로는 작동하지 않을 것입니다). 하지만 당신이'~'메소드를 사용했다고 생각합니다. – avacariu

답변

2

확실하지 할 수 -t1 email -a1 [email protected]하고. 내가 : 대신에 을 사용했기 때문에 포트 번호로 IP 주소를 처리해야했기 때문에 :을 사용하면 문제가 발생할 수 있습니다.

0

이전 질문이지만이 문제에 대해 배우고 답변을 게시 할 것입니다.

import argparse 

parser = argparse.ArgumentParser(
    description='Adds a new modem to Iridium account', 
    formatter_class=argparse.ArgumentDefaultsHelpFormatter 
) 
parser.add_argument('imei', metavar='I', help="the modem's IMEI") 
parser.add_argument('-m1', nargs=2, metavar=("type","address"), default=['directip', '75.101.138.217:9097'], help='Call setting') 
parser.add_argument('-m2', nargs=2, metavar=("type","address"), help='Call setting') 
parser.add_argument('-m3', nargs=2, metavar=("type","address"), help='Call setting') 
parser.add_argument('-m4', nargs=2, metavar=("type","address"), help='Call setting') 
parser.add_argument('-m5', nargs=2, metavar=("type","address"), help='Call setting') 

args = parser.parse_args() 

type1 = args.multi1[0] 
address1 = args.multi1[1] 
if not type1 in ['email', 'directip', 'sbddevice']: 
    args.print_help() 
    sys.exit(1) 
...