Python 分组argparse子parser参数

Python 分组argparse子parser参数,python,argparse,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

我有一个脚本,它有多个命令,每个命令都使用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
=->test.py-h
用法:test.py[-h]。。。
位置参数:
可用命令
cmd1命令1
cmd2命令2
cmd3命令3
cmd4命令4
可选参数:
-h、 --帮助显示此帮助消息并退出
=->test.py cmd1-h
用法:test.py cmd1[-h]--flag1 flag1
可选参数:
-h、 --帮助显示此帮助消息并退出
--flag1 flag1测试标志
=->test.py cmd2-h
用法:test.py cmd2[-h][--flag2 flag2]
可选参数:
-h、 --帮助显示此帮助消息并退出
--flag2 flag2测试标志
我想以某种方式将这些命令分成若干组,以便用户看到如下内容:

=->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
=->test.py-h
用法:test.py[-h]。。。
第一组:
cmd1命令1
cmd2命令2
第二组:
cmd3命令3
cmd4命令4
可选参数:
-h、 --帮助显示此帮助消息并退出
但是,看起来不像add_argument_group和add_subparser一起工作


有什么办法可以做到这一点吗?

你是对的,参数组和子参数不能一起工作。这是因为子帕斯(或者说他们的名字)不是参数

sp=parser.add_subparsers(…)
命令创建一个参数,或者从技术上说是
argparse.Action
子类的一个实例。这是一个位置参数。
add\u parser
命令创建一个
parser
对象(即调用
argparse.ArgumentParser
),并将其及其名称(和别名)添加到此操作拥有的词典中。这些名称填充动作的
选项
属性

子parser
操作可能属于参数组,但由于此类操作只能有一个,因此它无法帮助您对帮助行进行分组

在某种程度上,您可以通过使用描述来控制帮助,并省略子parser的帮助

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

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}

-允许对argparse子命令进行分组


谈论做你想做的事。我提出的补丁并不琐碎。但是欢迎您测试它。

我使用的是Python 3.6,这几乎可以正常工作。在结束示例输出的
{cmd1,cmd2,cmd3,cmd4}
行下面仍然有原始帮助输出的其余部分。关于如何抑制它有什么想法吗?我知道这是一个老评论,但是对于任何发现它的人来说,添加help=argparse.suppress到parser.add_subparsers()可以将命令隐藏在描述下面(python 3.9,还没有检查其他版本)