对argparse subparser参数进行分组

Pav*_*kov 4 python argparse

我有一个包含多个命令的脚本,每个命令都使用add_subparser来获取它自己的必需和/或可选参数集.

=->test.py -h
usage: test.py [-h] <command> ...

positional arguments:
  <command>   Available Commands
    cmd1      Command 1
    cmd2      Command 2
    cmd3      Command 3
    cmd4      Command 4

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


=->test.py cmd1 -h
usage: test.py cmd1 [-h] --flag1 FLAG1

optional arguments:
  -h, --help     show this help message and exit
  --flag1 FLAG1  Test flag


=->test.py cmd2 -h
usage: test.py cmd2 [-h] [--flag2 FLAG2]

optional arguments:
  -h, --help     show this help message and exit
  --flag2 FLAG2  Test flag
Run Code Online (Sandbox Code Playgroud)

我想以某种方式将这些命令分成组,以便用户看到如下内容:

=->test.py -h
usage: test.py [-h] <command> ...

First Group:
  cmd1      Command 1
  cmd2      Command 2

Second Group:
  cmd3      Command 3
  cmd4      Command 4

optional arguments:
  -h, --help  show this help message and exit
Run Code Online (Sandbox Code Playgroud)

但是,看起来不像add_argument_group和add_subparsers一起工作.

有没有办法实现这个目标?

hpa*_*ulj 7

你是对的,参数组和子分析器不能一起工作.那是因为subparsers(或者更确切地说是他们的名字)不是参数.

该sp = parser.add_subparsers(...)命令创建一个参数,或者从技术上创建一个子类的实例argparse.Action.这是一个位置论证.该add_parser命令创建一个parser对象(即调用argparse.ArgumentParser),并将其及其名称(和别名)添加到此操作所拥有的字典中.并且名称填充choices了Action 的属性.

该subparsersAction可以属于一个参数组,但由于只能有一个这样的操作,因此它无助于您对帮助行进行分组.

您可以通过使用说明在某种程度上控制帮助,并省略对子分析程序的帮助

import argparse

description = """
First Group:
  cmd1      Command 1
  cmd2      Command 2

Second Group:
  cmd3      Command 3
  cmd4      Command 4"""

parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
sp = parser.add_subparsers(title='commands',description=description)
sp.add_parser('cmd1')
sp.add_parser('cmd2')
sp.add_parser('cmd3')
sp.add_parser('cmd4')

parser.print_help()
Run Code Online (Sandbox Code Playgroud)

产生

1343:~/mypy$ python stack32017020.py 
usage: stack32017020.py [-h] {cmd1,cmd2,cmd3,cmd4} ...

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

commands:

  First Group:
    cmd1      Command 1
    cmd2      Command 2

  Second Group:
    cmd3      Command 3
    cmd4      Command 4

  {cmd1,cmd2,cmd3,cmd4}
Run Code Online (Sandbox Code Playgroud)

http://bugs.python.org/issue9341 - 允许对argparse子命令进行分组

谈论做你想做的事.我提出的补丁并非无足轻重.但欢迎您测试它.