【问题标题】:How to show help for all subparsers in argparse?如何在 argparse 中显示所有子解析器的帮助?
【发布时间】:2013-02-01 20:25:08
【问题描述】:

我做了一个 Python 脚本,它做了很多动作,所以它有很多选项,所以我把它分成了子解析器,这些子解析器也使用父解析器进行常见的选项分组。

我想要一个帮助选项来显示所有命令及其选项的帮助,是否可以不覆盖 format_help 方法?

我看到了similar question,但分组对我来说并不重要,我只想要那里的选项。

例如:

general_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False)
general_group.add_argument('--threads', action='store_true', default=False)
second_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False)
second_group.add_argument('--sleep', action='store', default=60, type=int)
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group,second_group])
subparsers.add_parser('Start',parents=[general_group])

args = parser.parse_args()

在这种情况下,如果有人运行 ./script.py -h,我希望他们会在帮助中看到线程选项。

【问题讨论】:

  • 您将parents 参数传递给子解析器是否有原因?使用general_group 作为“父级”(意思是subparsers = general_group.add_subparsers())并且 传递parents=[...] 实际上显示 在执行./script.py -h--threads 选项。
  • 是的,我有 3 个这样的组...
  • 那么你发布的不是一个最小的工作示例。发布一些代码,准确显示您正在尝试做的事情。
  • 使示例与我的实际代码更相似,我无法在此处发布确切的代码,因为它是内部的。

标签: python argparse


【解决方案1】:

问题在于:

subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group,second_group])
subparsers.add_parser('Start',parents=[general_group])

您将general_group 作为父级添加到子解析器,因此主解析器不知道它们,这导致./script.py -h 不显示--threads。如果您打算将其作为所有子解析器的父级,那么您应该将其作为顶级解析器父级:

parser = argparse.ArgumentParser(parents=[general_group])
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[second_group])
subparsers.add_parser('Start')

结果:

$ python script.py -h
usage: script.py [-h] [--threads] {Restart,Start} ...

positional arguments:
  {Restart,Start}

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

但请注意,在这种情况下,该选项仅是父解析器的一部分,而不是子解析器的一部分,这意味着:

$python script.py --threads Start

是正确的,而:

$ python script.py Start --threads
usage: script.py [-h] [--threads] {Restart,Start} ...
script.py: error: unrecognized arguments: --threads

因为--threads 没有被子解析器“继承”。如果您想在子解析器中也有--threads,则必须在其parents 参数中指定它:

parser = argparse.ArgumentParser(parents=[general_group])
subparsers=parser.add_subparsers(dest='action')
subparsers.add_parser('Restart',parents=[general_group, second_group])
subparsers.add_parser('Start', parents=[general_group])

这应该做你想做的:

$ python script.py -h
usage: script.py [-h] [--threads] {Restart,Start} ...

positional arguments:
  {Restart,Start}

optional arguments:
  -h, --help       show this help message and exit
  --threads
$ python script.py Start -h
usage: script.py Start [-h] [--threads]

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

【讨论】:

  • 听起来它回答了我的问题,我会对其进行测试,如果它有效,我会将你的答案标记为已接受,同时投赞成票。
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 2023-03-23
  • 2015-12-11
  • 2013-12-04
  • 2012-06-19
  • 2019-03-16
  • 2021-09-16
  • 2014-06-14
相关资源
最近更新 更多