我的主要python函数接受argv
并使用这些参数调用另外两个函数来设置整个应用程序。
问题是,如果argv
包含-h
(` - help),那么它将传递给第一个函数,它会按预期打印它的用法消息(由argparse生成),如下所示:
optional arguments:
-h, --help show this help message and exit
-x section
然后执行停止!,我们又回到了提示符。
我希望继续执行,以便调用第二个函数,并且还会打印其用法消息。有谁知道如何实现这一目标?
答案 0 :(得分:3)
argparse提供的help命令的默认实现显示帮助消息并退出。您需要阻止添加它,并定义您自己的自定义参数,显示帮助而不退出。
首先,在创建解析器时使用add_help=False
关键字参数以防止添加默认实现。然后正常添加您自己的参数,当它发生时,请调用parser.print_help()
以显示帮助消息。
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-h','--help', action='store_true')
args = parser.parse_args(argv)
if args.help:
parser.print_help()
答案 1 :(得分:2)
您需要捕获SystemExit
例外:
exited = None
try:
function1(argv)
except SystemExit as e:
# don't exit just yet
exited = e
function2(argv)
# If function 2 *did not* exit, there was a legitimate reason
# re-raise the SystemExit exception
if exited is not None:
raise exited
请注意,我存储 function1
中引发的系统退出异常;它可能是由于不同的动作而不是-h
标志而引发的。如果function2
本身没有引发异常,我们会重新提升原始SystemExit
异常以便正确清理。
except SystemExit as e:
语句捕获局部变量e
中的异常。这样分配的局部变量通常在except
块的末尾删除(以防止参考周期);如果要在except
套件之外使用该异常,则需要将其存储在 new 变量中;这就是为什么exited
是在except
套件之外定义的单独变量。
或者,您可以选择使用-h
选项完全删除function1
argparser中的add_help=False
切换,然后在那里手动处理帮助。