2017-05-20 6 views
1

多くのコマンドライン引数を渡して、clickライブラリを使用して、DOCというグローバル変数(この場合はdict)を初期化したいとします。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. なぜ@click.command()@cli.command()に置き換えると、コマンドラインオプション--logger-fileが認識されないのですか?

答えて

0

カップル。

なぜ私はこんにちは!印刷されていますか?

クリックは、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を解析しているのと同じ機能から呼び出す必要があることに気付きます。変数として渡してください....

関連する問題