선택적 위치 인수를 Argparse?


652

다음과 같이 사용할 스크립트가 있습니다. usage: installer.py dir [-h] [-v]

dir 다음과 같이 정의 된 위치 인수입니다.

parser.add_argument('dir', default=os.getcwd())

dir선택 사항이 되기를 원합니다. 지정하지 않으면 그냥 있어야 cwd합니다.

불행히도 dir인수를 지정하지 않으면 얻을 수 Error: Too few arguments있습니다.

답변:


825

사용 nargs='?'(또는 nargs='*' 둘 이상의 디렉토리가 필요한 경우)

parser.add_argument('dir', nargs='?', default=os.getcwd())

확장 된 예 :

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

14
를 수행 ?하고 *그들이 정규 표현식 (즉,에 의미 같은 것을 의미하는 ?0 또는 1을 필요로 *0을 필요 이상)? 그렇다면 +잘 작동합니까?
Dolan Antenucci

37
@dolan : 그렇습니다 +. 자세한 내용은 docs.python.org/2/library/argparse.html#nargs 를 참조 하십시오.
Vinay Sajip

2
선택적 인수에 dir을 표시하는 방법이 있습니까? 또는 위치 인수에 선행하는 '선택적'한정자가 있어야합니다. (도움이 관련된 한) 등록 할 수 있습니까?
scagnetti

6
@ant 위에서, dir이 선택적이라는 것을 알 수 있습니다 (argparse 출력에서 ​​대괄호로 표시됨).
Vinay Sajip

1
Tx! 내가했던 것처럼 에서 dir에 액세스 options.dir하지 마십시오 args.dir!
ptim

69

@VinaySajip의 확장으로 대답하십시오. 언급 할만한 추가 nargs가치가있다 .

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N (정수). 명령 행에서 N 개의 인수가 함께 목록으로 수집됩니다.

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'. 존재하는 모든 명령 행 인수는 목록으로 수집됩니다. nargs='*' 여러 개의 위치 인수를 갖는 것이 일반적으로 의미가 없지만 여러 개의 선택적 인수를 nargs='*'사용할 수 있습니다.

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+'. '*'와 마찬가지로 존재하는 모든 명령 행 인수는 목록으로 수집됩니다. 또한 하나 이상의 명령 줄 인수가 없으면 오류 메시지가 생성됩니다.

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER. 나머지 모든 명령 줄 인수는 목록으로 수집됩니다. 이것은 일반적으로 다른 명령 행 유틸리티로 디스패치하는 명령 행 유틸리티에 유용합니다.

는 IF nargs키워드 인수가 제공되지 않는 인수의 수는 작용에 의해 결정된다 소비했다. 일반적으로 이것은 단일 명령 행 인수가 소비되고 단일 항목 (목록이 아님)이 생성됨을 의미합니다.

편집 (@Acumenus의 코멘트에서 복사) nargs='?' 문서 는 '?'라고 말합니다. 가능하면 하나의 인수가 명령 행에서 사용되어 단일 항목으로 생성됩니다. 명령 줄 인수가 없으면 기본값의 값이 생성됩니다.


3
그러나 nargs='?'목록을 생성하지는 않습니다.
Acumenus

대답의 @ABB 마지막 라인은 Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.희망이 ...하는 데 도움이
마타스 Vaitkevicius

1
인용 된 라인은 정의하지 않는 경우를 의미 nargs하지만, nargs='?'그것을 정의된다. 문서는 말 : '?'. 가능한 경우 명령 행에서 하나의 인수가 사용되며 단일 항목으로 생성됩니다. 명령 줄 인수가 없으면 기본값의 값이 생성됩니다.
Acumenus

@ABB 무언가가 빠졌다고 생각되면 답을 편집하십시오. 감사.
Matas Vaitkevicius

무엇 차이점은 무엇 nargs=argparse.REMAINDERnargs='*'그것이 나에게 보인다, 그들은 그들의 효과와 동일 (파이썬 2.7.10 및 파이썬 3.6.1에서 테스트)이다?

-5

parser.add_argument또한 스위치가 필요합니다 . 사용할 수 있습니다 required=False. 다음은 Python 2.7의 샘플 스 니펫입니다.

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

11
OP는 '--dir'이 아니라 위치 매개 변수에 대해 묻고있었습니다. '필수'는 위치에 대한 잘못된 인수입니다. 그리고 '거짓'은 오타였으며 그녀는 '거짓'을 의미했습니다. 초보자의 경우 +1, 부주의의 경우 -1
SoloPilot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.