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()
4

6 回答 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.fillwhich 除其他外,从 Epilog 中删除换行符。由于我们希望保留换行符,因此我们继承OptionParser并更改format_epilog

于 2009-12-07T01:57:59.680 回答
12

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

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

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

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

于 2011-02-03T05:54:44.993 回答
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 变得安静(我正在寻找 wabbits)
-fFILE,--file= FILE 将输出写入 FILE
-mMODE, --mode=MODE 交互模式:'新手','中级',[默认],'专家'之一

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

看看这里

于 2009-12-07T01:51:22.220 回答
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,当然不包括prints。

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

于 2010-05-13T20:49:19.270 回答
2

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

16.4.3.1。创建解析器

于 2009-12-07T01:54:49.700 回答
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 ""
于 2014-04-04T15:41:40.857 回答