python argparse在描述后打印用法文本

2024-05-16 12:30:07 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法用python argparse在描述文本之后打印用法文本?我有我的命令行argparse工作,但我想打印版本信息之前使用信息。在

编辑:

version: 1.0

usage: blahcmd [-h] [-help] 

some lovely help

Tags: 命令行文本信息编辑用法versionargparsehelp
3条回答

一个粗略的解决方案是将版本文本添加到您的使用行中。这并不完美(注意额外的“用法”文本),但这只是一个开始

In [64]: parser=argparse.ArgumentParser(description='description')
# 'usage' parameter just sets the 'usage' attribute
In [67]: parser.usage='version 1.0.1\n'+parser.format_usage()
In [68]: parser.print_help()
usage: version 1.0.1
usage: ipython [-h]

description

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

help中组件的顺序由ArgumentParser.format_help方法确定(引用argparse.py文件):

^{pr2}$

我可以想象编写一个自定义方法来添加您的版本信息,例如

def format_help(self):
    formatter = self._get_formatter()

    # version info
    formatter.add_text('version 1.0.1')

    # usage
    formatter.add_usage(self.usage, self._actions,
                        self._mutually_exclusive_groups)
    ...

ipython中,此函数起作用:

In [74]: def format_help(parser):
    formatter=parser._get_formatter()
    formatter.add_text('version 1.0.1')
    formatter.add_usage(parser.usage, parser._actions, parser._mutually_exclusive_groups)
    formatter.add_text(parser.description)
    return formatter.format_help()
In [75]: print format_help(parser)
version 1.0.1

usage: ipython [-h]

description

argparse模块不提供添加“prolog”的任何选项。当显示帮助时,它总是以usage:开头。最好的方法是在实例化ArgumentParser时使用^{}参数自定义用法文本并添加版本号:

import argparse

parser = argparse.ArgumentParser(usage='Any text you want\n')

请注意,帮助仍将以usage:开头。在

一个可行的肮脏的解决方法是用一个\r来启动usage消息:

^{pr2}$

这是一个可移植的用法。可能有一些终端无法使用这个技巧。我已经对版本字符串进行了ljust编辑,以确保当技巧起作用时,整个{}字符串将从字符串中消失,并且在使用短版本字符串时不会得到类似v1.2e:的内容。在

注意:现在必须手动创建完整的文本。在

这是一个丑陋的黑客攻击(见我对原始问题的评论):

定义您自己的HelpFormatter子类,用formatter_class选项传递给解析器。子类可能应该重写_format_usage方法。这并不完全是推荐的,因为用于定义自己的格式化类的接口从未公开过。在

from argparse import ArgumentParser, HelpFormatter
from gettext import gettext as _

class VersionedHelp(HelpFormatter):
    def _format_usage(self, usage, actions, groups, prefix=None):
        if prefix is None:
            prefix = _('Version: x.y\n\nusage: ')
        return HelpFormatter._format_usage(self, usage, actions, groups, prefix)

p = ArgumentParser(formatter_class=VersionedHelp)
p.parse_args()

相关问题 更多 >