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

时间:2014-03-13 14:57:45

标签: python argparse

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

编辑:

version: 1.0

usage: blahcmd [-h] [-help] 

some lovely help

3 个答案:

答案 0 :(得分:4)

这是一个丑陋的黑客(请参阅我对原始问题的评论):

定义您自己的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()

答案 1 :(得分:4)

argparse模块没有提供添加" prolog"的任何选项。显示帮助时,始终usage:开头。您可以做的最好的方法是在实例化ArgumentParser时使用usage参数自定义添加版本号的使用文本:

import argparse

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

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

可能有效的肮脏变通方法是使用usage启动\r消息:

>>> import argparse
>>> usage = '\r{}\nusage: %(prog)s etc.'.format('Version a b'.ljust(len('usage:')))
>>> parser = argparse.ArgumentParser(usage=usage)
>>> parser.parse_args(['-h'])
Version a b
usage:  etc.

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

我不认为\r的这种用法是可移植的。可能有一些终端,这个技巧不起作用。我已ljust修改了版本字符串,以确保当该技巧有效时,整个usage:字符串会从字符串中消失,并且您不会获得v1.2e:之类的内容使用短版本字符串。

注意:您必须手动立即创建整个 usage文字。

答案 2 :(得分:2)

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

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文件):

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

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

    # description
    formatter.add_text(self.description)

    # positionals, optionals and user-defined groups
    for action_group in self._action_groups:
        formatter.start_section(action_group.title)
        formatter.add_text(action_group.description)
        formatter.add_arguments(action_group._group_actions)
        formatter.end_section()

    # epilog
    formatter.add_text(self.epilog)

    # determine help from format above
    return formatter.format_help()

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

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