2017-12-18 3 views
0

두 개의 프로그램이 있습니다. 하나는 다른 프로그램의 래퍼입니다.python/argparse에서 인수 제거 (parse_known_args를 사용하지 않고)

메인 프로그램은

--arg4 내가되고 싶은, 인수 위해, 인수 - 하나, --arg1, --arg2 래퍼 프로그램은 모든 주요 프로그램의 인수 및 추가 인수 --arg3을 가지고있다 '인수가 인식되지 않음'오류없이 래퍼에서 주 프로그램으로 인수를 전달할 수 있습니다. 그러나 나는 을 사용하지 않습니다.은 parse_known_args를 사용하려고합니다. 오타가 있거나 무의미한 인수를 사용하면 사용자가 피드백을받지 못하기 때문입니다. (나는 이미 this question을 보았습니다)

수동으로 모든 단일 인수 이름을 검색 한 다음 이름이 존재하는 경우 그 이름 바로 다음에 올 모든 값과 그 뒤에 인수를 요구하는 인수가 더 있습니다 어떤 값 집합에 대한 나의 주장을 다른 파서에 전달하기위한 우아한 방법.

+1

는 무슨 일이 일어나고 있는지 명확하게 몇 가지 예제 코드를 부여합니다. 래퍼가 모든 인수를 처리하는 경우 주 어댑터가 처리 할 수없는 인수를 무시하는지 여부는 중요하지 않습니다. 링크 된 응답에서 첫 번째 파서는 partial을 사용하고 보조 파서는 두 번째로 전달합니다. 'arg3/4'를 포착하여 나머지를'extras'로 넘겨주는 더미 파서를 시도해 볼 수도 있습니다. – hpaulj

답변

1

다양한 부분 parsings 혼합 예 :

import argparse 

def foo(parser, alist): 
    for arg in alist: 
     parser.add_argument('--'+arg, action='store_true') 

parser1 = argparse.ArgumentParser() 
foo(parser1, ['arg1','arg2']) 

parser2 = argparse.ArgumentParser() 
foo(parser2, ['arg3','arg4']) 

parser12 = argparse.ArgumentParser() 
foo(parser12, ['arg1','arg2','arg3','arg4']) 

args = parser12.parse_args() 
print('p12', args) 

args, extras = parser2.parse_known_args() 
print('p2',args, extras) 

args = parser1.parse_args(extras) 
print('p1',args) 

args, extras = parser1.parse_known_args() 
print('p1p',args, extras) 

없음 :

1714:~/mypy$ python3 stack47866170.py 
p12 Namespace(arg1=False, arg2=False, arg3=False, arg4=False) 
p2 Namespace(arg3=False, arg4=False) [] 
p1 Namespace(arg1=False, arg2=False) 
p1p Namespace(arg1=False, arg2=False) [] 

모든 :

1722:~/mypy$ python3 stack47866170.py --arg1 --arg2 --arg3 --arg4 
p12 Namespace(arg1=True, arg2=True, arg3=True, arg4=True) 
p2 Namespace(arg3=True, arg4=True) ['--arg1', '--arg2'] 
p1 Namespace(arg1=True, arg2=True) 
p1p Namespace(arg1=True, arg2=True) ['--arg3', '--arg4'] 

서브셋

1723:~/mypy$ python3 stack47866170.py --arg1 --arg2 
p12 Namespace(arg1=True, arg2=True, arg3=False, arg4=False) 
p2 Namespace(arg3=False, arg4=False) ['--arg1', '--arg2'] 
p1 Namespace(arg1=True, arg2=True) 
p1p Namespace(arg1=True, arg2=True) [] 
1723:~/mypy$ python3 stack47866170.py --arg1 --arg3 
p12 Namespace(arg1=True, arg2=False, arg3=True, arg4=False) 
p2 Namespace(arg3=True, arg4=False) ['--arg1'] 
p1 Namespace(arg1=True, arg2=False) 
p1p Namespace(arg1=True, arg2=False) ['--arg3'] 
,

오류 - parser12에 의해 체포 :

1724:~/mypy$ python3 stack47866170.py --arg1 --foo 
usage: stack47866170.py [-h] [--arg1] [--arg2] [--arg3] [--arg4] 
stack47866170.py: error: unrecognized arguments: --foo 
+0

이것은 선택적 args만으로는 훌륭하게 작동하지만, 각 파서에 대한 위치 인수가있는 경우 솔루션이 아닙니다 ... 그렇지만 – dWitty

+0

을 수락하면 여러 파서를 사용할 때 위치가 하드 핸들이됩니다. 그것들을 파싱 만하면 작동 할 수도 있습니다. – hpaulj

관련 문제