在正常情况下,我的应用程序会将一组配置值加载到上下文中,并将这些值传递给具有pass_context
的子命令。只有一种情况下,这将无法工作-第一次运行应用程序和配置尚未设置。你知道吗
我的目标是允许用户运行一个子命令并生成适当的配置,以便CLI在其余时间工作。你知道吗
我的cli.py
代码:
import sys
import click
from ruamel.yaml import YAML
from pathlib import Path
from commands.config_cmds import configcmd
MYAPP = "AwesomeCLI"
@click.group()
@click.version_option()
@click.pass_context
def cli(ctx):
"""command line application"""
ctx.ensure_object(dict)
ctx.obj['APPLICATION_NAME'] = MYAPP
config_file = Path(click.get_app_dir(ctx.obj[MYAPP])) / "config.yml"
yaml = YAML(typ="safe")
try:
config_yml = yaml.load(config_file)
except FileNotFoundError:
click.secho("Run command: awesome-cli configcmd first-run", fg='red')
raise click.FileError(config_file.name, "Missing configuration file.")
ctx.obj['CONFIG'] = yaml.dump(config_yml)
cli.add_command(configcmd)
我的configcmd
代码:
@click.group()
def configcmd():
"""Manage configuration of this tool
\f
The configuration file is saved in $HOME/.config/awesome-cli
"""
@config.command()
@click.pass_context
def first_run(ctx):
"""
Set up CLI configuration.
"""
api_key = click.prompt("Your API Key")
# More stuff here about saving this file...
如果我运行python awesome-cli configcmd
,我会收到以下错误(如预期的那样):
Run command: awesome-cli configcmd first-run
Error: Could not open file config.yml: Missing configuration file.
但是,如果我运行这个命令python awesome-cli configcmd first-run
,我会收到相同的错误,这不是我的目标。很明显,我应该在这段代码中得到这个错误,但那是因为我不知道如何根据被调用的命令/子命令添加异常。你知道吗
我需要在cli.py
中的cli
函数中添加什么,这样当(并且仅当)用户正在运行configcmd first-run
时,我就不会尝试加载配置文件了?任何其他命令/子命令都要求此配置文件存在,因此我希望保留对这些文件的检查。你知道吗
要在执行基于所调用的特定子命令的子命令之前调用某些特定代码,可以查看
ctx.invoked_subcommand
,如:在您的示例中,您需要检查每个级别的
ctx.invoked_subcommand
,如:测试代码:
结果:
相关问题 更多 >
编程相关推荐