argparse --help输出去除标记后空格及使用colorama实现帮助输出着色
argparse help输出格式与着色问题解决方案
一、原生argparse格式错乱修复
你遇到的空格、多余[]都是argparse默认格式化类的已知问题,用空metavar的hack方法本来就会有副作用,最优解是自定义帮助格式化类,直接重写参数格式拼接逻辑:
import argparse from argparse import HelpFormatter import colorama from colorama import Fore, Style init(autoreset=True) class CleanHelpFormatter(HelpFormatter): # 去掉短参数和逗号之间的多余空格 def _format_action_invocation(self, action): if not action.option_strings: metavar, = self._metavar_formatter(action, action.dest)(1) return metavar parts = [] # 处理短参数+长参数拼接 if action.option_strings: parts.extend(action.option_strings) # 仅当参数需要接收值的时候才显示参数值标识 if action.nargs != 0 and action.metavar != '': metavar = self._metavar_formatter(action, action.dest)(1)[0].strip() if metavar: parts[-1] += f' {metavar}' # 用', '拼接参数,不会产生多余空格 return ', '.join(parts)
替换你原来parser定义里的formatter_class为这个自定义类,同时去掉所有参数的metavar=''配置:
parser = argparse.ArgumentParser( description=Fore.RED + 'Some descriptive Text and such' + Fore.RESET, formatter_class=CleanHelpFormatter ) add_arg = parser.add_argument add_arg('-m', '--model', type=str, default='model_name', help="some help text") add_arg('-d', '--derp', type=str, default='burp', help="some more help text") add_arg('-x', '--xip', type=bool, default=False, const=True, nargs='?', help="some other help text")
此时运行-h输出的参数就会变成你预期的-m, --model格式,也不会有多余的[]符号。
二、着色问题修复
你之前着色报错、串色、缩进错乱的原因是:argparse计算帮助文本缩进宽度时,会把颜色转义序列算成普通字符长度,导致实际显示时缩进偏移,而且硬编码到help参数里的颜色代码没有正确重置也会串色。
要统一配置着色规则,直接在自定义的CleanHelpFormatter里扩展即可,不需要修改单个参数的配置:
class ColoredHelpFormatter(CleanHelpFormatter): def _format_action(self, action): # 获取参数标记和帮助文本 invocation_part = self._format_action_invocation(action) help_part = action.help if action.help else '' # 给不同部分加指定颜色 colored_invocation = Fore.CYAN + invocation_part + Fore.RESET colored_help = Fore.YELLOW + help_part + Fore.RESET # 追加默认值显示 if action.default is not argparse.SUPPRESS: default_str = f" (default: {Fore.GREEN}{action.default}{Fore.RESET})" colored_help += default_str # 手动计算缩进,抵消转义字符带来的长度计算误差 indent = ' ' * 2 col_width = 20 return f"{indent}{colored_invocation:<{col_width + len(Fore.CYAN) + len(Fore.RESET)}}{colored_help}\n"
把formatter_class换成ColoredHelpFormatter即可实现统一着色,不会出现串色和缩进错乱问题。
注意:不要在单个参数的help属性里硬编码颜色代码,统一在格式化类里处理可避免90%的着色异常问题
三、推荐第三方库
如果不想自己写自定义格式化类,推荐两个目前维护活跃、使用简单的方案:
rich-argparse:仅需替换formatter_class,无需修改其他argparse代码,自动生成排版整洁、自带配色的帮助输出,兼容所有现有argparse配置。typer:基于Python类型提示的命令行库,自动生成帮助、支持补全、原生支持着色,语法比argparse简洁很多,适合新写的脚本。
内容的提问来源于stack exchange,提问作者liquidRock
相关产品推荐
相关产品推荐

