2016-09-20 5 views
7

내 도구에서 명령 행 옵션을 처리 할 때 훌륭한 Python Click 라이브러리를 사용합니다. 여기에 내 코드의 단순화 된 버전 (전체 스크립트 here은)입니다 :Python Click : 사용자 정의 오류 메시지

사람이 어떤 플래그없이 명령을 실행하는 경우
@click.command(
    context_settings = dict(help_option_names = ['-h', '--help']) 
) 
@click.argument('analysis_dir', 
       type = click.Path(exists=True), 
       nargs = -1, 
       required = True, 
       metavar = "<analysis directory>" 
) 

def mytool(analysis_dir): 
    """ Do stuff """ 

if __name__ == "__main__": 
    mytool() 

, 그들은 얻을 기본 클릭 오류 메시지 :

$ mytool 

Usage: mytool [OPTIONS] <analysis directory> 

Error: Missing argument "analysis_dir". 

이 좋은,하지만 난 초보 사용자들에게 도움말 플래그를 사용하여 더 많은 도움을받을 수 있다고 말하고 싶습니다. 즉, 명령이 유효하지 않은 경우 오류 메시지에 사용자 정의 문장을 추가하여 사람들에게 mytool --help을 시도하여 자세한 정보를 얻으십시오.

쉬운 방법이 있나요? 나는 required 속성을 제거하고 주 기능에서이 논리를 처리 할 수 ​​있다는 것을 알고 있지만, 그러한 사소한 추가에 대해 일종의 해킹을 느낀다.

+0

정확히 같은 문제가 있습니다. 실수로 실수로 도움이 필요하면 자동으로 도움말을 출력하거나 사용자에게 도움을받는 방법을 알려줍니다. 그렇지 않으면 우리는 도구를 사용하는 모든 사람들이 유닉스 기반 사고에 익숙하다고 가정해야합니다. 나는 지금까지 클릭하는 것을 좋아하지만 초심자가 쉽게 사용할 수있는 도구를 만드는 데 도움이 될 것이기 때문에이 질문에 답을 얻지 못했다는 것을 낙담하게합니다. – user1677663

+0

그냥 해결책이 될 수있는 이걸 찾았습니다. http://stackoverflow.com/questions/35642202/python-click-return-the-helper-menu – user1677663

+0

아니, 그건 작동하지 않았다. – user1677663

답변

3

python-click에서 대부분의 오류 메시지 구성은 UsageError 클래스의 show 메서드 (click.exceptions.UsageError.show)에 의해 처리됩니다.

따라서이 방법을 다시 정의하면 사용자 정의 된 오류 메시지를 직접 작성할 수 있습니다.

import click 
@click.group() 
def cli(): 
    pass 

modify_usage_error(cli) 

: 당신이 당신의 주요 명령을 정의하면

def modify_usage_error(main_command): 
    ''' 
     a method to append the help menu to an usage error 

    :param main_command: top-level group or command object constructed by click wrapper 
    :return: None 
    ''' 

    from click._compat import get_text_stderr 
    from click.utils import echo 
    def show(self, file=None): 
     import sys 
     if file is None: 
      file = get_text_stderr() 
     color = None 
     if self.ctx is not None: 
      color = self.ctx.color 
      echo(self.ctx.get_usage() + '\n', file=file, color=color) 
     echo('Error: %s\n' % self.format_message(), file=file, color=color) 
     sys.argv = [sys.argv[0]] 
     main_command() 

    click.exceptions.UsageError.show = show 

, 그런 다음 수정 스크립트를 실행할 수 있습니다 : 다음은이 SO question는 응답 오류 메시지에 대한 도움말 메뉴를 추가 사용자 지정의 예입니다 사용 오류가 아닌 ClickException의 런타임 호출이 있는지 여부를 조사하지 않았습니다. 그렇다면 사용자 정의 오류 처리기를 수정하여 초기화시 ClickException에 ctx가 제공되는 것으로 보이지 않으므로 click.exceptions.ClickException.show = show 행을 추가하기 전에 ctx가 속성인지 먼저 확인해야 할 수 있습니다.

+0

환상적입니다, 감사합니다 RJ! 이는 하나의 예외를 제외하고는 완벽하게 작동합니다. 재귀 오류가 발생하여'main_command() '에 대한 최종 함수 호출을 제거해야했습니다. – tallphil

+0

이것은 좋은 느낌! https://github.com/ewels/MultiQC/commit/62cc60 7 개월 동안이 작업을 수행 할 수 없다는 것에 대해 낮은 수준의 성가심을 나타 냈습니다! 다시 한 번 감사드립니다! – tallphil