python optparse,如何在使用输出中包含其他信息?

时间:2009-12-07 01:48:08

标签: python optparse

使用python的optparse模块我想在常规使用输出下面添加额外的示例行。我当前的help_print()输出如下所示:

usage: check_dell.py [options]

options:
-h, --help     show this help message and exit
-s, --storage  checks virtual and physical disks
-c, --chassis  checks specified chassis components

我希望在我的工作中包含较少* nix识字用户的用法示例。像这样:

usage: check_dell.py [options]

options:
-h, --help     show this help message and exit
-s, --storage  checks virtual and physical disks
-c, --chassis  checks specified chassis components

Examples:

check_dell -c all
check_dell -c fans memory voltage
check_dell -s

我将如何做到这一点? optparse选项允许哪些选项?目前的代码:

import optparse

def main():
    parser = optparse.OptionParser()
    parser.add_option('-s', '--storage', action='store_true', default=False, help='checks virtual and physical disks')
    parser.add_option('-c', '--chassis', action='store_true', default=False, help='checks specified chassis components')

(opts, args) = parser.parse_args()

6 个答案:

答案 0 :(得分:41)

parser = optparse.OptionParser(epilog="otherstuff")

默认format_epilog剥离换行符(使用textwrap),因此您需要在解析器中覆盖format_epilog,如下所示。

def main():

    class MyParser(optparse.OptionParser):
        def format_epilog(self, formatter):
            return self.epilog

    parser =MyParser(epilog=
"""Examples:

check_dell -c all
check_dell -c fans memory voltage
check_dell -s
""")
...

这里有更多细节 如果您在班级optparse.py中查看OptionParser,则会有一个名为format_epilog的方法,该方法由format_help

调用

这是optparse.py的片段

def format_epilog(self, formatter):
    return formatter.format_epilog(self.epilog)

def format_help(self, formatter=None):
    if formatter is None:
        formatter = self.formatter
    result = []
    if self.usage:
        result.append(self.get_usage() + "\n")
    if self.description:
        result.append(self.format_description(formatter) + "\n")
    result.append(self.format_option_help(formatter))
    result.append(self.format_epilog(formatter))
    return "".join(result)

formatter.format_epilog的默认行为是使用textwrap.fill除其他外,从epilog中删除换行符。由于我们希望保留换行符,因此我们将OptionParser子类化并更改format_epilog的行为

答案 1 :(得分:12)

详细说明获胜的答案(这有助于我在自己的代码中解决同样的问题),一个快速而肮脏的选项是使用身份方法直接覆盖类的方法:

optparse.OptionParser.format_epilog = lambda self, formatter: self.epilog
optparser = optparse.OptionParser(epilog=helptext)

将帮助文本打印为逐字的结语。

我认为这会覆盖程序中所有OptionParser类使用的结果格式,但是,所有这些结果都必须逐字传递到程序中其他位置使用OptionParser的地方。

答案 2 :(得分:5)

使用usage参数:

usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)

您可以添加更多内容(仅作为示例):

group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)

示例输出:

  

用法:[选项] arg1 arg2

     

选项:-h, - help显示此帮助信息并退出
  -v, - verbose产生大量噪音[默认]
  -q, - 静静(我正在狩猎wabbits)
  -fFILE, - file = FILE将输出写入FILE
  -mMODE, - mode = MODE交互模式:'新手','中间',[默认],'专家'之一

     

危险选择:注意:使用   这些选项由您自行承担风险。它   相信他们中的一些人会咬人。   -g组选项。

看看here

答案 3 :(得分:4)

关于如何执行此操作的另一个想法是禁用-h的默认行为并打印您自己的帮助屏幕,其中可以包含默认屏幕:

from optparse import OptionParser

parser = OptionParser(add_help_option=False, 
                      epilog="This can't be easily\n multilined")
parser.add_option('-h', '--help', dest='help', action='store_true',
                  help='show this help message and exit')

(options, args) = parser.parse_args()

if options.help:
    parser.print_help()
    print 'now we have an epilog'
    print 'with as many lines as you wish'
    sys.exit()

这基本上是解析器使用add_help_option=True的默认行为所做的事情,当然不包括print

但是,老实说,我也更喜欢在开头和结尾添加任意数量的描述行。

答案 4 :(得分:2)

您可以将description参数传递给OptionParser构造函数。这允许您包含在usage之后但在选项列表之前显示的任意文本。

请参阅16.4.3.1. Creating the parser

答案 5 :(得分:0)

我将IndentedHelpFormatter子类化,这非常简单:

class PlainHelpFormatter(optparse.IndentedHelpFormatter):
    def format_description(self, description):
        if description:
            return description + "\n"
        else:
            return ""
    def format_epilog(self, epilog):
        if epilog:
            return epilog + "\n"
        else:
            return ""