Python单击命令退出流
我有这个python click CLI设计(Python单击命令退出流,python,python-3.x,python-click,Python,Python 3.x,Python Click,我有这个python click CLI设计(wificli.py)。在命令执行结束时,它只打印相应的打印消息 例如,当执行命令python3.7 wificli.py png时,它只打印png,当执行命令python3.7 wificli.py terminal时,它只打印terminal 如我所示,我希望它也会打印启动函数的结束和主函数的结束,但它不是。其思想是只在一个地方清理资源,而不是在各自命令的每个出口点 import click @click.group() @click.opti
wificli.py
)。在命令执行结束时,它只打印相应的打印消息
例如,当执行命令python3.7 wificli.py png
时,它只打印png
,当执行命令python3.7 wificli.py terminal
时,它只打印terminal
如我所示,我希望它也会打印启动函数的结束和主函数的结束,但它不是。其思想是只在一个地方清理资源,而不是在各自命令的每个出口点
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')
执行时由于您没有提出具体问题,我只能发布对我有用的内容,并附上背后的理由,如果这不是您想要的,我提前道歉
@main.resultcallback()
def处理结果(结果,**kwargs):
打印('启动函数结束')
单击.get_current_context().obj['callback']()
def start():
main(obj={'callback':lambda:print('End of main function')})
因此,resultcallback
似乎是处理组终止和调用命令的建议方法。在我们的例子中,它打印启动函数的结束,因为此时启动函数已经完成执行,所以我们在终止main
之前结束。然后,它检索通过上下文传入的回调,并执行该回调
我不确定这是否是惯用的方式,但它似乎具有预期的行为
对于结果回调,回答了类似的问题
至于到底是什么导致了这种行为,这只是一个猜测,基于在组或命令中放置yield的一些快速实验,我怀疑产生了某种线程/处理器来处理组及其命令的执行
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')
希望这有帮助