argparse:在 --help 中的标志后删除空格并使用 colorama 为帮助输出着色

Posted

技术标签:

【中文标题】argparse:在 --help 中的标志后删除空格并使用 colorama 为帮助输出着色【英文标题】:argparse: Remove whitespace after flags in --help and colorizing help output with colorama 【发布时间】:2021-12-27 00:26:30 【问题描述】:

我在脚本中添加了一些 args,其中 argparse 功能正常。现在我正在尝试格式化--help 输出。我已将metavar='' 添加到每个产生更清晰输出的输出中,但是在单个标志之后有空格使文本变得奇怪。

问题

标志将显示为-m , --model 而不是-m, --model

带有type=boolconstnargs 的标志显示为-x [], --xip [],添加了额外的空间和[]

没有找到太多关于如何清理它的信息。确实在 python.org 上发现了关于额外空间是一个已知问题并且使用 metavar='' 并不理想的讨论。

示例代码:

import argparse
import colorama
from colorama import init, Fore, Style
init(autoreset=True)

parser = argparse.ArgumentParser(description=Fore.RED + 'Some descriptive Text and such' + Fore.WHITE, formatter_class=argparse.ArgumentDefaultsHelpFormatter)
add_arg = parser.add_argument
add_arg('-m',   '--model',  type=str, default='model_name',                     help="some help text", metavar='')
add_arg('-d',   '--derp',   type=str, default='burp',                           help="some more help text", metavar='')
add_arg('-x',   '--xip',    type=bool, default=False, const=True, nargs='?',    help="some other help text", metavar='')
args = parser.parse_args()

运行 python script.py -h 产生:

usage: script.py [-h] [-m] [-d] [-x ]

Some descriptive Text and such # <-- this line displays as RED

optional arguments:
  -h, --help           show this help message and exit
  -m , --model         some help text (default: model_name)
  -d , --derp          some more help text (default: burp)
  -x [], --xip []      some other help text (default: False)

将 metavar 更改为 metavar='\b' 会产生以下结果:

usage: script.py [-h] [-m] [-d] [-x ]] # <- extra bracket ]

Some descriptive Text and such

optional arguments:
  -h, --help         show this help message and exit
  -m, --model    some help text (default: model_name)   # indent broken
  -d, --derp     some more help text (default: burp)    # indent broken
  -x ], --xip ]  some other help text (default: False)  # indent broken

着色输出

我还想知道如何使用 colorama 正确着色 --help 输出。为描述着色很容易,但是尝试为标志添加颜色会产生预期的错误。如果之前添加了颜色以帮助工作,例如help=Fore.YELLOW + 'some help text',但它会为它之后的所有内容着色,并且不能在它之后添加 anymroe Fore 而不会出现错误。将它添加到其他任何地方都会产生错误。

有没有办法定义如何为标志和帮助文本着色,可能在设置它们的位置之外?

除此之外,是否有任何用于 argparse 格式化的包?我发现一些旧的不太正常,但没有什么新东西。

【问题讨论】:

尝试metavar='\b' 删除空格...不太喜欢花时间格式化argparse 帮助。 @Bakuriu 这删除了空格,但它也破坏了帮助文本上的缩进(就像在文本之前删除了一个选项卡)。但是,对于带有constnargs 的args,它留下了空格并取出了左括号,也破坏了帮助文本的对齐方式。我将编辑我的帖子以显示发生了什么。 您可以继承HelpFormatter,并修改相关方法。您无法使用现有参数来使此显示“更清晰”。 不要使用type=bool。产生False 的唯一字符串是bool(''),您的用户无法提供。 【参考方案1】:

好吧,我在 SO 上找到了一些旧帖子后设法弄明白了。

来自This Post 的代码设置了一个add_argument_group。然后通过设置help=argparse.SUPPRESS 添加参数并隐藏帮助文本。

--help 中显示的实际文本是组的titledescription。这使得它变得非常容易,因为此时您只是连接字符串,并且可以在需要时使用+ 轻松添加您的颜色样式。

帖子中的代码:

parser = argparse.ArgumentParser(description='Postfix Queue Administration Tool',
        prog='pqa',
        usage='%(prog)s [-h] [-v,--version]',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        )
parser.add_argument('-l', '--list', action='store_true',
        help='Shows full overview of all queues')
g = parser.add_argument_group(title='information options',
        description='''-q, --queue <queue>     Show information for <queue>
-d, --domain <domain>   Show information about a specific <domain>''')
g.add_argument('-q', '--queue', action='store', metavar='', dest='queue',
        help=argparse.SUPPRESS)
g.add_argument('-d', '--domain', action='store', metavar='<domain>', dest='domain',
        help=argparse.SUPPRESS)
parser.add_argument('-v', '--version', action='version', version='%(prog)s 0.1')
parser.print_help()

我根据该帖子修改的示例代码:

import argparse
from colorama import init, Fore, Style
init(autoreset=True)

parser = argparse.ArgumentParser(
    description=Fore.LIGHTBLACK_EX + 'Some descriptive Text and such' + Fore.WHITE,
    prog='script.py',
    usage=Fore.WHITE + '%(prog)s [-m] [-d] [-x]',
    formatter_class=argparse.RawDescriptionHelpFormatter,
    )
g = parser.add_argument_group(title=Fore.LIGHTBLACK_EX + 'args',
        description=Fore.RED + '''
-m   --model        ''' + Fore.WHITE + Style.DIM + '''some help text       || default: model_name''' + Fore.RED + Style.NORMAL + '''
-d   --derp         ''' + Fore.WHITE + Style.DIM + '''some more help text  || default: burp''' + Fore.RED + Style.NORMAL + '''
-x   --xip          ''' + Fore.WHITE + Style.DIM + '''some other help text || default: False''' + Fore.RED + Style.NORMAL + '''\n\n''')
g.add_argument('-m',   '--model',   type=str, default='model_name',                      help=argparse.SUPPRESS, metavar='')
g.add_argument('-d',   '--derp',    type=str, default='burp',                            help=argparse.SUPPRESS, metavar='')
g.add_argument('-x',   '--xip',     type=str2bool, default=False, const=True, nargs='?', help=argparse.SUPPRESS, metavar='')

args = parser.parse_args()

输出:

usage: script.py [-m] [-d] [-x]

Some descriptive Text and such

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

args:
  
  -m   --model        some help text       || default: model_name
  -d   --derp         some more help text  || default: burp
  -x   --xip          some other help text || default: False

终端中输出的附加图像:

最后,根据 @hpaulj 的建议,I found this function,这样我就可以从 bool 更改类型并确保它始终正确解析。

def str2bool(v):
    if isinstance(v, bool):
        return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')

【讨论】:

以上是关于argparse:在 --help 中的标志后删除空格并使用 colorama 为帮助输出着色的主要内容,如果未能解决你的问题,请参考以下文章

Python命令模块argparse学习笔记

Argparse:制作所需的标志

管道 bash 到特定的 python 标志

如何有一个特定的子命令需要带有 argparse 的标志?

Argparse:在“--help”中包含默认值的方法?

处理 argparse 输入中的空格