1

在传递一些命令行参数并使用库之后,我想初始化一个全局变量,在这种情况下是dict调用的。DOCclick

我尝试了以下方法:

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

2 回答 2

0

从函数赋值给全局变量需要global声明。

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

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

于 2017-05-20T18:39:32.967 回答
0

关于点击如何工作的几个误解。

为什么我看不到你好!被打印?

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

@click.group() 是什么?

这个问题:

为什么如果我将 @click.command() 替换为 @cli.command() 它无法识别命令行选项 --logger-file ?

与做什么有关@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为 required 但还指定了默认值。
  2. 我使用os.path.expanduser()而不是直接使用环境变量。
  3. 在设置变量 DOC 时,你需要告诉 python 它是一个全局变量。

    但是,为什么是全球性的?在你理解了这篇文章顶部第一个问题的答案之后,你会意识到这个程序实现的任何功能都需要从你正在解析的同一个函数中调用yaml。所以,你可能应该通过它作为一个变量....

于 2017-05-20T18:41:01.277 回答