使用-h调用时不要停止执行函数

时间:2012-10-17 09:16:05

标签: python command-line-arguments argument-passing argparse

我的主要python函数接受argv并使用这些参数调用另外两个函数来设置整个应用程序。

问题是,如果argv包含-h(` - help),那么它将传递给第一个函数,它会按预期打印它的用法消息(由argparse生成),如下所示:

optional arguments:
  -h, --help       show this help message and exit
  -x section

然后执行停止!,我们又回到了提示符。

我希望继续执行,以便调用第二个函数,并且还会打印其用法消息。有谁知道如何实现这一目标?

2 个答案:

答案 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切换,然后在那里手动处理帮助。