1

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

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

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

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

我希望执行继续,所以第二个函数也被调用,并且它的使用消息也被打印出来。有谁知道如何做到这一点?

4

2 回答 2

4

argparse 提供的帮助命令的默认实现显示帮助消息并退出。您需要防止添加它,并定义您自己的自定义参数来显示帮助而不退出。

首先,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()
于 2012-10-17T09:25:58.667 回答
3

您需要捕获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套件之外使用该异常,则需要将其存储在一个变量中;这就是为什么在套件exited之外定义一个单独的变量的原因。except

或者,您可以选择使用该选项-h从 argparser 中完全删除开关,然后在此处手动处理帮助。function1add_help=False

于 2012-10-17T09:19:56.500 回答