如何在argparse中显示所有子解析器的帮助?

发布于 2021-01-29 14:56:38

我制作了一个Python脚本,该脚本可以执行很多操作,因此它具有许多选项,因此我将其划分为一些子解析器,这些子解析器也使用父解析器进行常见选项分组。

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

我看到了类似的问题,但是分组对我来说并不重要,我只想在那里找到选项。

例如:

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,他们将在帮助中看到线程选项。

关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题在于:

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看