如何用argparse更改subparser的格式

时间:2015-05-06 22:33:44

标签: python python-3.x argparse

我知道使用构造函数创建的主解析器有max_help_position,但是如何更改subparsers格式,因为我有一些非常长的命令名,我希望帮助消息与它对齐。

#!/usr/bin/env python

import argparse
import subprocess

parser = argparse.ArgumentParser(description="example",
                                 formatter_class=argparse.RawDescriptionHelpFormatter)

subparsers = parser.add_subparsers(title="available commands",metavar="command [options ...]")

parser1 = subparsers.add_parser('short-cmd', help='help message')
parser1.add_argument('--path')

parser2 = subparsers.add_parser('very-long-long-name-for-a-command', help='help message')
parser2.add_argument('--path')

args = parser.parse_args()

输出:

usage: test.py [-h] command [options ...] ...

example

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

available commands:
  command [options ...]
    short-cmd           create a directory for database
    very-long-long-name-for-a-command
                        create a directory for database

我想要的是什么:

usage: test.py [-h] command [options ...] ...

example

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

available commands:
  command [options ...]
    short-cmd                          create a directory for database
    very-long-long-name-for-a-command  create a directory for database

1 个答案:

答案 0 :(得分:1)

您正确地注意到有max_help_position来控制help行的缩进。 HelpFormatter __init__中的默认值为24

但诀窍是改变它。

一种方法是子类HelpFormatter(或者如果你需要的话,可以是Raw ...)。

class MyFormatter(argparse.HelpFormatter):
    def __init__(self,prog):
        super(MyFormatter,self).__init__(prog,max_help_position=55)
parser=argparse.ArgumentParser(formatter_class=MyFormatter)

理论上,您可以使用:

创建或修改formatter
formatter = argparse.HelpFormatter(`prog`, max_help_position=40)

formatter = argparse.HelpFormatter('prog')
formatter._max_help_position = 45

但要做到这一点,你必须在这个调用树中调整一些地方:

`-h`
parser.print_help()
    parser.format_help()
        parser._get_formatter()
            parser.formatter_class(prog=self.prog)

(如果您认为我删除了有用的内容,请查看我的编辑记录。)