Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python单击命令退出流_Python_Python 3.x_Python Click - Fatal编程技术网

Python单击命令退出流

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

我有这个python click CLI设计(
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')
希望这有帮助