2017-11-13 7 views
1

Click과 함께 app을 python 3.6에 작성하고 있습니다. 내가 찾을 수없는 오류가있는 것 같습니다. 아래 코드를 게시했습니다.python click app이 "누락 된 인수"표시와 함께 실패했지만 문제를 찾을 수 없습니다.

python clickapp.py --help 

모두가 좋은 :

문제는 내가 입력 할 때이다. 내가

python clickapp.py simplerequest --help 

를 입력 할 때하지만 내가 인수 "디렉토리"를 잃었 나타내는 오류를 얻을 수 있지만, 오류의 원인을 표시 할 역 추적이 없습니다. 정확한 출력은 다음과 같습니다.

Usage: clickapp.py [OPTIONS] STARTDATE ENDDATE DIRECTORY COMMAND [ARGS]... 

Error: Missing argument "directory". 

다음은 내가 사용했던 코드입니다. 이것은 파일 이름이 clickapp.py 인 최소한의 예입니다.

import click 

@click.group() 
@click.argument('startdate') 
@click.argument('enddate') 
@click.argument('directory', type=click.Path()) 
@click.pass_context 
def cli(ctx, 
     startdate, 
     enddate, 
     directory): 

    ctx.obj['directory'] = directory 
    ctx.obj['startdate'] = startdate 
    ctx.obj['enddate'] = enddate 


@click.command() 
@click.argument('arg1', type=str) 
@click.argument('arg2', type=click.Path(exists=True)) 
@click.argument('arg3', type=int) 
@click.pass_context 
def SimpleRequest(ctx, 
        arg1, 
        arg2, 
        arg3): 

    """Simple request processor""" 

    ctx.obj['arg1'] = arg1 
    ctx.obj['arg2'] = arg2 
    ctx.obj['arg3'] = arg3 

cli.add_command(SimpleRequest) 

if __name__ == '__main__': 
    cli(obj={}) 

누구든지 오류의 출처를 볼 수 있습니까?

  1. 내가 그 문제의 원인이 될 수 있는지 확인하기 위해 arg2type=click.Path(exists=True)을 제거 :

    나는 몇 가지를 시도했다. 그러나 그것은 아무것도 바뀌지 않았습니다.

  2. 또한 사전에 ctx 사전에 변수를 삽입하는 것과 관련된 유효성 검사 로직을 제거하려고했으나 도움이되지 않았습니다.

+0

@Stephen 감사합니다. 네가 한 말만 기대 했어. 기본적으로 clickapp.py에는 모든 명령에 공통적 인 몇 가지 인수가 있으며 각 명령에는 몇 가지 특정 인수가 있습니다. 그래서 나는'python clickapp.py startdate enddate directory simplerequest arg1 arg2 arg3'을 원한다. 그것은 어쨌든 아이디어였습니다. 더 나은 표준 방법이 있다고 생각되면 전달하십시오. – krishnab

+0

아, 그래서'startdate, enddate,'및'directory' 옵션을 만들 수 있습니다. 그것들이 채워지지 않으면 합리적인 기본값을 가질 수 있기 때문에 그렇게 될 것입니다. 그렇다면'simplerequest'가 첫 번째 인수가 될 것입니다. 좋아. 도와 줘서 고마워. – krishnab

답변

1

도움이되는 구문 분석 문제는 클릭이 startdate endate directory 인수를 먼저 채우려고한다는 것입니다.

그래서 simplerequest --help이 처음 두 개를 채운 다음 세 번째 (directory)가 누락되었다고 불평합니다.

일반적으로 명령 (simplerequest)이 첫 번째 인수가됩니다. 그런 다음 선택적 args를 추가 할 수 있습니다. 왜냐하면 click은 명령과 쉽게 구별 할 수 있기 때문입니다.

또는 첫 번째 인수를 유효한 명령으로보고 어쨌든 도움을 줄 수 있습니다. 그러나 이것은 비표준이며 일부 코드가 필요합니다. 또한 쉽게 구분할 수는 있지만 명령 이름을 시작 날짜로 사용할 수 없게됩니다.

+1

나는 그것을 밖으로 시험하고 당신의 제안을 사용하여 잘 작동한다. – krishnab