如何在argparse中显示所有subparser的帮助?

时间:2013-02-17 07:08:59

标签: python argparse

我制作了一个Python脚本,它执行了很多操作,所以它有很多选项,所以我把它分成了也使用父解析器进行常见选项分组的subparsers。

我想要一个帮助选项,它会显示所有命令及其选项的帮助,是否可以不覆盖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他们会在帮助中看到线程选项。

1 个答案:

答案 0 :(得分:4)

问题在于:

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。如果你打算把它作为所有subparser的父级,那么你应该把它作为顶级解析器父级:

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不是由subparser“继承”的。如果你想在subparser中也有--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