设置自动日志任何时候点击CLI命令调用?



我目前在我的代码中使用click来设置大量的命令行工具,但是我想在调用X函数时运行相当于click.echo("CLI function X was called")的函数。是否有一种方法可以在我的项目中设置这个?还是我必须为每个CLI函数单独添加这个函数?

我需要这个,并修改了这个答案来得到一个解决方案。给定这个基本的点击组:

import click
@click.group()
def cli():
pass
@cli.command()
@click.argument("name", default="World")
def hello(name):
print(f"Hello, {name}!")
if __name__ == "__main__":
cli()

我添加了一个函数,接受一个上下文和调用方法:

def _invoke(self, ctx, invoke):
command = getattr(ctx, "command", ctx).name
print(f"Running {command}: {ctx.params}")
result = invoke(self, ctx)
print(f"Completed {command}")
return result

然后我创建了几个自定义类,它们覆盖invoke命令来调用上面的函数:

class _Group(click.Group):
def invoke(self, ctx):
return _invoke(self, ctx, click.Group.invoke)
class _Command(click.Command):
def invoke(self, ctx):
return _invoke(self, ctx, click.Command.invoke)

将函数添加到现有脚本中很简单,通过cls参数将类传递到组和方法的装饰器中,即:

@click.group(cls=_Group)
def cli():
pass
@cli.command(cls=_Command)
@click.argument("name", default="World")
def hello(name):
print(f"Hello, {name}!")

运行hello命令现在在命令执行前后打印到控制台:

$ python3 cli.py hello StackOverflow
Running cli: {}
Running hello: {'name': 'StackOverflow'}
Hello, StackOverflow!
Completed hello
Completed cli

相关内容

  • 没有找到相关文章

最新更新