2017-01-26 1 views
1

파이썬에서 argparse 모듈을 사용하여 명령 행 인터페이스를 작성하려하지만 내 인수 중 하나에 대한 도움말 메시지에 문제가 있습니다. 인수는 1 개 인수 (파일 이름) 또는 3 개 인자 (파일 이름, 열, 열) 중 하나를 취해야한다, 그래서 그것을 접근하는 방법이 있습니다 : 다음nargs = '+'일 때 어떻게 괄호로 묶인 [...] 도움말 메시지가 표시되지 않습니까?

parser = argparse.ArgumentParser() 
parser.add_argument('--score', nargs ='+', help='score file, default X Y = 2 4', 
    metavar='FILENAME X Y') 
args = parser.parse_args() 

과 IF-다른 :

if len(args.score) == 1: 
    data = open(args.score[0]) 
    S1 = 1 
    S2 = 3 
elif len(args.score) == 3: 
    data = open(args.score[0]) 
    S1 = int(args.score[1]) - 1 
    S2 = int(args.score[2]) - 1 
else: 
    print('Error: --score incorrect number of arguments called') 

-h, --help   show this help message and exit 
    --score FILENAME X Y [FILENAME X Y ...] 
         score file, default X Y = 2 4 

내가 괄호 부분은 멀리 가고 싶어 :하지만 내 도움말 메시지는 다음과 같습니다

-h, --help   show this help message and exit 
    --score FILENAME X Y score file, default X Y = 2 4 

편집
여기 내가 ANSI 이스케이프 코드 사용이기는하지만 해키 해결 방법으로 수정 프로그램을 구현하기 위해 선택하는 방법은 다음과 같습니다

parser.add_argument('--score', nargs ='+', help='\x1b[A\b\b\b\b\b\b X Y \x1b[1C\b score file, default X Y = 2 4', 
    metavar=('FILENAME', '')) 

출력을

usage: test.py [-h] [--score FILENAME [...]] 

optional arguments: 
    -h, --help   show this help message and exit 
    --score FILENAME X Y score file, default X Y = 2 4 

감사를 제공을 메타 바 튜플 아이디어에 대한 @hpaulj.

답변

0

metavar없이 도움은 다음과 같습니다

usage: ipython3 [-h] [--score SCORE [SCORE ...]] 

optional arguments: 
    -h, --help   show this help message and exit 
    --score SCORE [SCORE ...] 
         score file, default X Y = 2 4 

SCORE은 longname에서 유래하고, '%s [%s ...]' % get_metavar(2) 형식입니다. 나는이 개 항목의 튜플에 metavar을 변경하는 경우

, 그들은 nargs = 3 SCORE

usage: ipython3 [-h] [--score NAME [XY ...]] 

optional arguments: 
    -h, --help   show this help message and exit 
    --score NAME [XY ...] 
         score file, default X Y = 2 4 

의 두 인스턴스를 교체, 나는 metavar에서이 말을 줄 수 얻을 :

usage: ipython3 [-h] [--score NAME X Y] 
.... 
2 개 인수로 입력 준다

분할

In [774]: parser.add_argument('--FILENAME', help='score file', metavar='NAME'); 
In [775]: parser.add_argument('--XY', nargs=2, help='x,y'); # type=int 
In [776]: parser.print_help() 

usage: ipython3 [-h] [--FILENAME NAME] [--XY XY XY] 

optional arguments: 
    -h, --help  show this help message and exit 
    --FILENAME NAME score file 
    --XY XY XY  x,y 

============

def _format_args(self, action, default_metavar): 
    get_metavar = self._metavar_formatter(action, default_metavar) 
    .... 
    elif action.nargs == ONE_OR_MORE: 
     result = '%s [%s ...]' % get_metavar(2) 
    ... 
: =====

실제 포맷은 HelpFormatter._format_args 방법에 의해 제조된다

0

커맨드 라인 인터페이스의 세계에서 비표준입니다. 인수 구문을 재 설계해야합니다. 대신에이 두 가지를 지원의 :

--score FILENAME 
--score FILENAME X Y 

이러한 대안 중 하나를 고려해야합니다

--score FILENAME [-x X] [-y Y] 
--score FILENAME[=X,Y] 

둘 다 표준 명령 행 인수 구문 분석 라이브러리를 사용하여 지원하기 쉬운 것입니다.

관련 문제