2017-05-20 5 views
1

많은 경우 명령 줄 인수를 전달하고 click 라이브러리를 사용하여 이라는 전역 변수 (이 경우 dict, DOC)를 초기화하고 싶습니다.cli : dict 및 그룹 클릭 함수를 초기화하는 방법

나는 시도 다음

#!/usr/bin/python3 

import os 
import sys 
import yaml 
import logging 
import click 

DOC = {} 


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

@click.command() 
@click.option("--logger-file", required=True, default='{}/blabla/cfg/logger.{}.yml'.format(os.environ['HOME'],os.path.basename(__file__)), show_default=True, help="YAML logging configuration file") 
def cli_logger_file(logger_file): 
    if os.path.exists(logger_file): 
     try: 
      with open(logger_file, "rt") as f: 
       DOC = yaml.safe_load(f.read()) 
       print("logger") 
     except Exception as e: 
      print(str(e)) 
      sys.exit() 
    else: 
     sys.exit() 


if __name__ == '__main__': 
    cli_logger_file() 
    print("hi!") 
    print(DOC) 

을하지만 그것을 실행할 때, 출력은 다음과 같습니다

$ python3 etc.py --logger-file=/home/blabla/cfg/logger.src.app.component.yml 
logger 
{} 

당신이 날 이해하는 데 도움이 시겠어요 :

  1. 을 내가 왜 hi!이 인쇄되지 않습니까?
  2. @cli.command()으로 바꾸면 명령 줄 옵션 --logger-file을 인식하지 못하는 이유는 무엇입니까?

답변

0

커플.

안녕하세요! 인쇄 중이 야?

클릭하면 cli 프로그램을 작성하기위한 프레임 워크입니다. 프레임 워크가 핸들러를 호출 한 후에 핸들러가 반환되지 않습니다.

@ click.group()이란 무엇입니까?

이 질문 :

이유는이 명령 줄 옵션 --logger 파일을 인식하지 못합니다() @의 cli.command와 @의 click.command()를 대체 할 경우?

@click.group()과 관련이 있습니다. 그룹은 하위 명령을 구현하기위한 특수 프로세서입니다. 따라서 귀하의 경우 그룹 클릭을 사용하면 --flags앞에 하위 명령이 해석됩니다. 그러나 하위 명령이 없으므로 --flags이 그룹에서 사용됩니다. 필요가 없으므로 그룹을 삭제하십시오.

코드 :

@click.command() 
@click.option("--logger-file", 
       default=os.path.join(os.path.expanduser("~"), 
            'blabla/cfg/logger.{}.yml'.format(
             os.path.basename(__file__))), 
       show_default=True, 
       help="YAML logging configuration file") 

def cli(logger_file): 
    if os.path.exists(logger_file): 
     try: 
      with open(logger_file, "rt") as f: 
       global DOC 
       DOC = yaml.safe_load(f.read()) 
     except Exception as e: 
      click.echo(str(e)) 
      sys.exit() 
    click.echo('DOC: %s' % DOC) 

if __name__ == '__main__': 
    cli() 

노트 :

  1. 당신은 필요하지만 또한 지정하는 기본값으로 --loggerfile을 설정했다.
  2. 환경 변수를 직접 사용하는 대신 os.path.expanduser()을 사용했습니다.
  3. 변수 DOC를 설정할 때 파이썬에게 전역 변수임을 알려줄 필요가있다.

    하지만 왜 글로벌? 이 게시물의 첫 번째 질문에 대한 대답을 이해하면이 프로그램이 구현하는 모든 기능이 yaml을 구문 분석하는 것과 동일한 기능에서 호출되어야 함을 알게 될 것입니다. 변수로 전달하십시오 ....