2017-05-20 52 views
1

我想初始化一個全局變量,在這種情況下dictDOC,在傳遞了一些命令行參數和使用click庫。cli:如何初始化一個字典和組點擊函數

我曾嘗試以下:

#!/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()替換@click.command()它不能識別命令行選項--logger-file

回答

0

如何單擊作品一對夫婦的誤解。

爲什麼我沒有看到你好!正在印刷?

Click是編寫cli程序的框架。框架調用處理程序後,它不返回...

什麼是@ click.group()?

這個問題:

爲什麼,如果我取代@ click.command()與@ cli.command()不承認的命令行選項--logger文件?

@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時,您需要告訴python它是一個全局變量。

    但是,爲什麼一個全球?在瞭解了本文頂部第一個問題的答案之後,您將會意識到,該程序實現的任何功能都需要從解析yaml所用的相同函數中調用。因此,您可能應該將其作爲變量傳遞......