2017-10-12 12 views
1


나는 다음과 같은 명령 행 문자열을 구문 분석해야합니다옵션과 함께 여러 위치 인수를 구문 분석하는 방법은 무엇입니까?

node frontend.js project1.pro project2.pro ... projectN.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -opt1 value1 ... -opt2 value2 

즉, 사용자 :(

혼합 할 수 있습니다 (시작에서 그것을 제외) 옵션 (하이픈) 및 위치 인수 나는 여러 위치 인수를 지정하려고하지만,이 작동되지 않은 :

parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('--foo') 
parser.add_argument('project_files', default=[], nargs='+') 
parser.add_argument('-spec', nargs=1, required=True) 
parser.add_argument('other_options', default=[], nargs='+') 
print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split())) 

그러나 그러한 있어요 오류 : 잘못 뭐하는 거지

PROG: error: unrecognized arguments: CONFIG+=debug CONFIG+=qml_debug 

감사합니다 질문은 바보 같은 경우

PS 미안 해요, 난 새로운 오전?! 이러한 라이브러리를 사용하는 Python 및 인수 구문 분석.
P.P.S. 인수 "노드 frontend.js는"

을 무시하는

답변

1
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을 사용할 수 있습니다. 알 수없는 문자열은 별도의 목록에 반환됩니다. optparsegetopt 같은

#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']) 

이전 파서 그냥 플래그 인수를 처리하고, 목록으로 나머지를 반환했습니다. 당신은 그 자신을 분석해야했습니다.

+0

따라서 "일반"옵션으로 구분 된 두 개 이상의 위치 인수 그룹을 가질 수 있습니다 - 또는 argparse는 그렇게 할 수 없습니까? – eraxillan

+0

UPD : 문제는 다른 응용 프로그램 (Qt qmake)의 명령 줄 형식을 지원해야하므로 옵션 형식을 변경할 수 없습니다. ( – eraxillan

+0

두 위치 사이에'-spec '이 정의되어 있다는 사실은 중요하지 않습니다. 구문 분석은 명령 행의 순서에 따라 결정됩니다. 이러한 종류의 처리를 정제하는 것에 관한 몇 가지 버그/문제점이 있지만 형식적인 변경은 없습니다. – hpaulj