【问题标题】:python argparse print usage text after descriptionpython argparse在描述后打印使用文本
【发布时间】:2014-04-18 10:05:05
【问题描述】:

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

编辑:

version: 1.0

usage: blahcmd [-h] [-help] 

some lovely help

【问题讨论】:

  • 请向我们展示您想要做什么的示例。
  • 一个相当丑陋的选择是定义您自己的HelpFormatter 子类,以使用formatter_class 选项传递给解析器。您的子类可能想要覆盖 _format_usage 方法。不完全推荐这样做,因为用于定义您自己的格式化类的接口从未公开。

标签: python argparse


【解决方案1】:

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

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

【讨论】:

  • 我正在写同样的东西,当我注意到这个幼稚的解决方案无法正常工作时,因为帮助以usage: 开头。
  • 旧答案替换为完全不同的丑陋黑客:)
  • 谢谢!我打算尝试类似的东西,我认为你的 hack 并不那么难看——即使依赖于一个未记录的 API。顺便说一句,我已经提交了一个编辑,以包含您评论中的解释(直到我仔细查看后才看到)。
【解决方案2】:

argparse 模块不提供任何添加“序言”的选项。当显示帮助时,它总是usage: 开头。您可以做的最好的事情是自定义使用文本添加版本号,在实例化ArgumentParser 时使用usage 参数:

import argparse

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

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

一个可行的解决方法是使用\r 开始usage 消息:

>>> 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 的这种用法是可移植的。这个技巧可能在某些终端上不起作用。我已经ljusted 版本字符串,以确保当技巧奏效时,整个usage: 字符串从字符串中消失,并且在使用短版本字符串时不会得到类似v1.2e: 的内容。

注意:您现在必须手动创建整个 usage 文本。

【讨论】:

    【解决方案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 文件):

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多