【问题标题】:Don't stop executing a function when called with -h使用 -h 调用时不要停止执行函数
【发布时间】:2012-10-07 12:16:42
【问题描述】:

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

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

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

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

我想继续执行,所以第二个函数也被调用,它的使用消息也被打印出来。有谁知道这是如何实现的?

【问题讨论】:

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


【解决方案1】:

您需要捕获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 套件之外定义的单独变量。

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

【讨论】:

  • 感谢您的帮助。我很欣赏提供的解决方案。我选择将使用从第一个函数移动到第二个函数,并关闭第一个函数中的使用。然后只有一个函数正在打印它的用法(我认为从用户的角度来看这更清楚)
【解决方案2】:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2018-01-24
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多