使用add_subparsers时从--help获得完全帮助

时间:2013-08-20 11:23:12

标签: python argparse

我有这个示例代码:

from argparse import ArgumentParser

parser = ArgumentParser()

parser.add_argument('config')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose')
group.add_argument('--quiet')

commands = parser.add_subparsers()
command = commands.add_parser('upload')
command.add_argument('path')
command.add_argument('--url')
command = commands.add_parser('check')
group = command.add_mutually_exclusive_group()
group.add_argument('--md5')
group.add_argument('--path')

if __name__=='__main__':
    parser.parse_args()

使用--help运行此命令:

usage: argparse_example.py [-h] [--verbose VERBOSE | --quiet QUIET]
                           config {upload,check} ...

positional arguments:
  config
  {upload,check}

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE
  --quiet QUIET

我希望它显示的是:

usage: argparse_example.py [-h] [--verbose VERBOSE | --quiet QUIET]
                           config {upload,check} ...

positional arguments:
  config
  {upload,check}

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE
  --quiet QUIET

sub-commands:

upload [-h] [--url URL] path

    positional arguments:
      path

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

check [-h] [--md5 MD5 | --path PATH]

    optional arguments:
      -h, --help   show this help message and exit
      --md5 MD5
      --path PATH

我确实已经实现了一个HelpFormatter子类,但很快就丢失了。

有没有人有这样一个子类的可行实现?

1 个答案:

答案 0 :(得分:0)

这足够接近吗?除了调整titleprog之外,我正在创建所有帮助字符串,缩进subparser,并将它们组合成字符串。

parser = ArgumentParser(prog='PROG')

parser.add_argument('config')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose')
group.add_argument('--quiet')

commands = parser.add_subparsers(title='subcommands')
command1 = commands.add_parser('upload',prog='upload')
command1.add_argument('path')
command1.add_argument('--url')
command2 = commands.add_parser('check',prog='check')
group = command2.add_mutually_exclusive_group()
group.add_argument('--md5')
group.add_argument('--path')

fmt1 = parser.format_help()
fmt2 = command1.format_help()
fmt2 = fmt2.replace('usage: ','')
fmt2 = fmt2.replace('\n','\n  ')
fmt3 = command2.format_help()
fmt3 = fmt3.replace('usage: ','')
fmt3 = fmt3.replace('\n','\n  ')
print('%s\n%s\n%s'%(fmt1,fmt2,fmt3))

产生:

usage: PROG [-h] [--verbose VERBOSE | --quiet QUIET] config {upload,check} ...

positional arguments:
  config

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE
  --quiet QUIET

subcommands:
  {upload,check}

upload [-h] [--url URL] path

  positional arguments:
    path

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

check [-h] [--md5 MD5 | --path PATH]

  optional arguments:
    -h, --help   show this help message and exit
    --md5 MD5
    --path PATH

调用此输出是另一个问题。它应该由parser.format_help()生成,即-h。另一个可选的行为方式相同吗?通过常规选择?