首页 > 解决方案 > Python点击命令退出流程

问题描述

我有这个 python click CLI 设计(wificli.py)。在命令执行结束时,它只打印相应的打印消息。

例如,当执行 command 时python3.7 wificli.py png,它只打印png,而当执行 command 时,python3.7 wificli.py terminal它只打印terminal

正如我所展示的,我希望它也会打印End of start functionEnd of the main function但事实并非如此。这个想法是只在一个地方而不是在相应命令的每个退出点清理资源。

import click

@click.group()
@click.option('--ssid', help='WiFi network name.')
@click.option('--security', type=click.Choice(['WEP', 'WPA', '']))
@click.option('--password', help='WiFi password.')
@click.pass_context
def main(ctx, ssid: str, security: str = '', password: str = ''):
    ctx.obj['ssid'] = ssid
    ctx.obj['security'] = security
    ctx.obj['password'] = password


@main.command()
@click.pass_context
def terminal(ctx):
    print('terminal')

@main.command()
@click.option('--filename', help='full path to the png file')
@click.pass_context
def png(ctx, filename, scale: int = 10):
    print('png')

def start():
    main(obj={})
    print('End of start function')

if __name__ == '__main__':
    start()
    print('End of main function')

执行时

标签: pythonpython-3.xpython-click

解决方案


由于您没有提出具体问题,我只能发布对我有用的内容及其背后的原因,如果这不是您想要的,我提前道歉。

@main.resultcallback()
def process_result(result, **kwargs):
    print('End of start function')
    click.get_current_context().obj['callback']()

def start():
    main(obj={'callback': lambda: print('End of main function')})

因此,这resultcallback似乎是处理组终止和调用命令的建议方式。在我们的例子中,它会打印End of start function,因为此时 start 函数已经执行完毕,所以我们在 terminating 之前结束main。然后,它检索通过上下文传入的回调,并执行它。

我不确定这是否是惯用的做法,但它似乎具有预期的行为。

对于结果回调,这里回答了一个类似的问题

至于究竟是什么导致了这种行为,这只是基于在组或命令中放置 yield 的一些快速实验的猜测,我怀疑产生了某种线程/处理器来处理组及其命令的执行.

希望这可以帮助!


推荐阅读