파이썬 인수는 인식 할 수없는 인수를 무시합니다.


206

Optparse, 이전 버전은 인식 할 수없는 모든 인수를 무시하고 계속 수행합니다. 대부분의 상황에서 이것은 이상적이지 않으며 argparse로 변경되었습니다. 그러나 인식 할 수없는 인수를 무시하고 지정한 인수를 구문 분석하려는 상황이 몇 가지 있습니다.

예를 들면 다음과 같습니다.

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

어쨌든 이것을 덮어 쓸 수 있습니까?


14
래퍼를 다른 프로그램에 작성하고 몇 가지 인수를 캡처하고 수정하지만 나머지는 전달하려는 경우 매우 유용합니다!
Alan De Smet

2
정확히 내가 왜 @AlanDeSmet을 끝내게 되었습니까! 내가 미친 짓을하려고하지 않아서 다행이다 :)
dwanderson

답변:


351

바꾸다

args = parser.parse_args()

args, unknown = parser.parse_known_args()

예를 들어

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']

21
+ parse_known_args
1-다음

7
나도 아니었다! 나는 심지어 docs.python.org/library/… 에서 그것을 놓쳤다 . 감사합니다
joedborg

1
이것은 parseargs와 함께 nosetest를 사용하려고 할 때 발생했습니다 (nosetest args의 사용을 거부했습니다) 이유는 테스트가 parser.parse_args(None)아닌 수행했기 때문 parser.parse_args([])입니다.
Andy Hayden

3
FWIW, 사용 parse_known_args하지 않고 코드를 parse_args사용할 수 있습니다 ( IPython Notebook의 모든 셀에 대한 조건입니다 ...이 코드는 호출 된 스크립트로 마이그레이션하려는 개발 및 테스트 코드를 크게 지원합니다. 명령 줄에서)ArgumentParserif __name__ == 'main':True
gumption

1
"알려지지 않은"옵션 인수로는 작동하지 않는 것 같습니다.
Sharud

21

나머지 부분 parser.add_argument('args', nargs=argparse.REMAINDER)을 사용하려면 새 인수에 넣을 수 있습니다 .


1
이것은 Python 2.7에서 작동하며 parse_args()필요하지 않습니다 parse_known_args().
OozeMeister

4
argparse.REMAINDER를 사용하면 오랫동안 버그가있는 것처럼 보입니다. 확실히 작동하지 않습니다. parse_known_args ()가 좋은 대안입니다.
Matt

1
방금 오래된 REMAINDER 버그가 발생했습니다 : bugs.python.org/issue17050
Scott Carpenter

7

실제로 argparse는 여전히 "무시" _unrecognized_args합니다. 이러한 "인식되지 않은"인수 가 기본 접두사사용하지 않는 한 파서로부터 불만을 듣지 않습니다.

parse.parse_args()다음 인수로 프로그램을 실행하려면 @anutbu의 구성을 사용하지만 standard를 사용하십시오.

$ program --foo BAR a b +cd e

이 네임 스페이스 데이터 수집을 작업 할 것입니다.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

기본 접두사를 -무시하려면 ArgumentParser를 변경하고 +대신 "인식 된"인수에 a를 사용하기로 결정 합니다.

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

동일한 명령으로

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

파이프에 넣고 담배를 피우십시오 =)

조이!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.