为何调用Click框架的main()后脚本无法执行后续代码?
使用Click框架后脚本提前退出的原因?
使用Click框架的脚本代码如下:
#!/usr/bin/env python3 import click @click.command() @click.option('--desiredrange', '-r', default=1) def main(desiredrange): print(desiredrange) print('abcd') main() print('!!!!')
运行后终端输出1和abcd,但不会输出!!!!,main()之后的任何代码都不会执行,脚本直接退出。
移除Click框架后的代码:
#!/usr/bin/env python3 def main(): print(1) print('abcd') main() print('!!!!')
运行后终端正常输出1、abcd和!!!!,后续代码可正常执行。两种场景均无报错,请问这是什么原因?
原因解析
核心问题出在Click的@click.command()装饰器上:
- 这个装饰器会把你的
main()函数包装成Click的命令对象,当你直接调用main()时,它在执行完函数内部逻辑后,会自动调用sys.exit()终止整个Python进程,所以后续代码根本没机会运行。 - 而普通函数调用只是执行函数体内的代码,执行完成后会回到调用位置,继续往下执行后续语句,自然能正常输出
!!!!。
解决办法
如果想让Click脚本执行完main()后继续运行后续代码,可以用两种方式:
- 调用
main.main()代替直接调用main(),这会只执行函数逻辑,不会触发进程退出 - 把后续要执行的代码放到
main()函数内部,比如把print('!!!!')移到函数里
内容的提问来源于stack exchange,提问作者dvines
相关产品推荐
相关产品推荐

