我目前在我的代码中使用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