Python optparse,如何在使用输出中包含附加信息?

26

我想使用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()

1
迁移到 argparse :-) - Ciro Santilli OurBigBook.com
6个回答

43
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的行为来实现。


非常感谢,太棒了,因为在optparse页面上没有记录。 - Tordek
这将是我第一个非Bash脚本,请原谅我的新手操作。如果我想要三到四行的后记,怎么办? - CarpeNoctem
+1 - 你每天都会学到新东西。我知道description并且已经用它做了类似的事情。这个更好。有趣的是,在解释器帮助文档中提到了它,所以它在docstring中... import optparse; help(optparse.OptionParser) 显示它... - D.Shawley
我添加了它,它运行得很好!谢谢gnibbler。昨天我刚读了《Python核心编程》中关于面向对象编程的章节,但我对这里发生的事情一无所知。我将盯着它发呆几个小时,直到我理解为止。祝我好运。 - CarpeNoctem
2
似乎在2.4之后添加了epilog :( - CarpeNoctem

12

对于获胜的答案进行详细解释(它帮助我解决了自己代码中遇到的同样问题),一个快速而简单的选择是直接使用标识方法覆盖类的方法:

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

为了作为一个逐字逐句的尾注打印帮助文本。

我认为这会覆盖程序中 OptionParser 类的所有用法的尾注格式,所以在程序的其他地方使用 OptionParser 时,所有这样的尾注都必须是逐字传递的。


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,--quiet 保持非常安静(我正在狩猎兔子)
-fFILE,--file = FILE 将输出写入文件
-mMODE,--mode = MODE 交互模式:'novice','intermediate',[默认值],'expert'之一

危险选项:注意:使用这些选项是您自己的风险。 据信其中一些会咬人。-g 组选项。

在这里查看


谢谢您的快速帮助!如果我想让示例出现在常规用法摘要下面怎么办? - CarpeNoctem

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操作。

但是,老实说,我更喜欢一种简单的方法,可以在开头和结尾添加任意数量的描述行。


2

你可以在OptionParser构造函数中传递一个description参数。这允许你在usage之后,选项列表之前包含任意文本。

请参见16.4.3.1. 创建解析器


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 ""

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接