cli:如何初始化字典和组点击功能
cli: how-to initialise a dict and group click functions
我想初始化一个全局变量,在本例中是一个名为 DOC
的 dict
,在传递了一些命令行参数并使用了 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
{}
你能帮我理解一下吗:
- 为什么我看不到
hi!
正在打印?
- 为什么我将
@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()
备注:
- 您已将
--loggerfile
设置为必填项,但还指定了默认值。
- 我使用了
os.path.expanduser()
而不是直接使用环境变量
在设置变量DOC时,需要告诉python它是全局的
但是,为什么是全局的?在您了解此 post 顶部第一个问题的答案后,您将意识到此程序实现的任何功能都需要从您正在解析 yaml
的同一函数中调用in。因此,您可能应该将其作为变量传递....
我想初始化一个全局变量,在本例中是一个名为 DOC
的 dict
,在传递了一些命令行参数并使用了 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
{}
你能帮我理解一下吗:
- 为什么我看不到
hi!
正在打印? - 为什么我将
@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()
备注:
- 您已将
--loggerfile
设置为必填项,但还指定了默认值。 - 我使用了
os.path.expanduser()
而不是直接使用环境变量 在设置变量DOC时,需要告诉python它是全局的
但是,为什么是全局的?在您了解此 post 顶部第一个问题的答案后,您将意识到此程序实现的任何功能都需要从您正在解析
yaml
的同一函数中调用in。因此,您可能应该将其作为变量传递....