print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++'.split()))
가 생산
Namespace(foo='B', other_options=['project_2.pro'], project_files=['project_1.pro'], spec=['linux-g++'])
'progject_2.pro'가 아니라 project_files
보다는 other_options
에 할당됩니다. 그것은 2 nargs='+'
이 어떻게 처리 되었기 때문입니다.
parse_args
은 positionals와 optionals (깃발 표시된)를 번갈아 처리합니다. 그리고 그것은 맞는 것처럼 많은 자리를 처리하려고합니다. 그 중 하나 이상이 및 *
과 같은 '개방형'nargs
인 경우 예기치 않은 결과가 발생할 수 있습니다. argparse: nargs='*' positional argument doesn't accept any items if preceded by an option and another positional
https://bugs.python.org/issue9338 - - argparse optionals with nargs='?', '*' or '+' can't be followed by positionals
2343:~/mypy$ python stack46702635.py
Namespace(foo='B', other=None, project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++')
Namespace(foo='B', other=['CONFIG+=debug', 'CONFIG+=qml_debug'], project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++')
https://bugs.python.org/issue15112 결과
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo')
parser.add_argument('project_files', nargs='+')
parser.add_argument('--spec')
parser.add_argument('--other', nargs='+')
print(parser.parse_args('--foo B project_1.pro project_2.pro --spec linux-g++'.split()))
print(parser.parse_args('--foo B project_1.pro project_2.pro --spec linux-g++ --other CONFIG+=debug CONFIG+=qml_debug'.split()))
: I가 변경 좋을 것
other
인수를 생략하고 parse_known_args
을 사용할 수 있습니다. 알 수없는 문자열은 별도의 목록에 반환됩니다. optparse
및 getopt
같은
#parser.add_argument('other', nargs='...')
print(parser.parse_known_args('--foo B project_1.pro project_2.pro --spec linux-g++'.split()))
print(parser.parse_known_args('--foo B project_1.pro project_2.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split()))
0859:~/mypy$ python stack46702635.py
(Namespace(foo='B', project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++'), [])
(Namespace(foo='B', project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++'), ['CONFIG+=debug', 'CONFIG+=qml_debug'])
이전 파서 그냥 플래그 인수를 처리하고, 목록으로 나머지를 반환했습니다. 당신은 그 자신을 분석해야했습니다.
따라서 "일반"옵션으로 구분 된 두 개 이상의 위치 인수 그룹을 가질 수 있습니다 - 또는 argparse는 그렇게 할 수 없습니까? – eraxillan
UPD : 문제는 다른 응용 프로그램 (Qt qmake)의 명령 줄 형식을 지원해야하므로 옵션 형식을 변경할 수 없습니다. ( – eraxillan
두 위치 사이에'-spec '이 정의되어 있다는 사실은 중요하지 않습니다. 구문 분석은 명령 행의 순서에 따라 결정됩니다. 이러한 종류의 처리를 정제하는 것에 관한 몇 가지 버그/문제점이 있지만 형식적인 변경은 없습니다. – hpaulj