cli:如何初始化字典和组点击功能

cli: how-to initialise a dict and group click functions

我想初始化一个全局变量,在本例中是一个名为 DOCdict,在传递了一些命令行参数并使用了 click 库之后。

我试过以下方法:

#!/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

Assigning to a global variable from a function requires a global declaration.

组命令是按名称调用的,所以当你使用@cli.command时你需要写:

$ python3 etc.py cli_logger_file --logger-file=foo.yml

关于点击如何工作的一些误解。

为什么我不看嗨!正在打印?

Click 是一个编写cli 程序的框架。框架调用您的处理程序后,它不会 return...

什么是@click.group()?

本题:

Why if I replace @click.command() with @cli.command() it does not recognize the command-line option --logger-file ?

@click.group()的作用有关。组是用于执行子命令的特殊处理器。因此,在您的情况下,使用组单击将解析任何 --flags before 子命令。但是您没有任何子命令,因此 --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它是全局的

    但是,为什么是全局的?在您了解此 post 顶部第一个问题的答案后,您将意识到此程序实现的任何功能都需要从您正在解析 yaml 的同一函数中调用in。因此,您可能应该将其作为变量传递....