2016-08-23 2 views
5

내가 이렇게 내 스크립트를 사용하려면 :argparse : 상호 배타적 인 인수를 선택적으로 만드는 방법?

python test.py run 
python test.py stop 

내 코드는 다음과 같다 :

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group(required=True) 
command_group.add_argument('run', help='run it', action='store_true') 
command_group.add_argument('stop', help='stop it', action='store_true') 

내가 그것을 실행

, 예외가 발생 : 그래서

ValueError: mutually exclusive arguments must be optional 

각 인수를 추가 할 때 required=False을 추가하려고합니다. 다른 예외가 발생합니다.

TypeError: 'required' is an invalid argument for positionals 

혼란 스럽습니다.

+0

왜 ['choices'] (https://docs.python.org/3/library/argparse.html#choices) 대신 뮤텍스 그룹을 사용합니까? – kennytm

답변

4

이렇게하는 더 좋은 방법은 두 가지 선택을 할 수있는 단일 위치 인수를 추가하는 것입니다. run이 주어

parser = argparse.ArgumentParser() 
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop')) 

경우, 값이 'run' 될 것입니다 : 당신이 선택되고 싶어하기 때문에, 0 또는 1 시간을 의미한다 nargs='?'을 사용합니다. stop이 주어지면 'stop'이됩니다. 둘 다 지정하지 않으면 None이됩니다.


실제로 상호 배타적 인 그룹을 사용하려는 경우 정확하게 수행 할 수 있는지 확실하지 않습니다. 당신은 그러나, 하이픈을 추가하여 그들에게 선택적 인수를 만들 수 있습니다

import argparse 

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('-run', help='run it', action='store_true') 
command_group.add_argument('-stop', help='stop it', action='store_true') 

물론 그의 문제는 사용자가 또한 하이픈을 제공해야합니다,하지만 당신이 경우 기대할 수있는 문제의 일종이다 너는 그렇게 자신을 제한한다.

+0

감사합니다. 작동합니다. 하지만 실제로 뮤텍스 그룹을 사용하려면 코드를 작성해야합니까? – huron

+0

@huron : 나는 할 수 있을지 확신하지 못합니다. 내 편집 된 답변보기 – zondo

+0

나는 본다. 고맙습니다! – huron

1

당신은 당신이

python test.py run 

또는

python test.py stop 

하지만 하지

와 프로그램을 호출 할 수 것이다 nargs='?'

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('run', help='run it', nargs='?') 
command_group.add_argument('stop', help='stop it', nargs='?') 

이것을 달성 할 수

python test.py run stop 
관련 문제