2009-12-07 36 views
25

使用python的optparse模块我想在常规用法输出下添加额外的示例行。我现在help_print()输出如下:python optparse,如何在使用输出中包含附加信息?

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() 
+0

迁移到argparse :-) – 2017-01-12 11:12:22

回答

39
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其中除其他事项外,带材从收尾的换行。由于我们希望新行被保留了,我们继承OptionParser和改变format_epilog

+0

非常感谢,这真棒,因为它没有在optparse页面上记录。 – Tordek 2009-12-07 02:02:50

+0

这将是我的第一个非bash脚本,请原谅我的努力。如果我想要三到四行epilog? – CarpeNoctem 2009-12-07 02:08:08

+0

只需3个额外的线条,我编辑了我的答案 – 2009-12-07 02:12:45

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) 

输出示例:

使用:[options] arg1 arg2

选项:-h,--help显示此帮助信息并退出
-v,--verbose使大量的噪音[默认]
-q,--quiet是vewwy安静(我在捉wabbits )
-fFILE,--file = FILE写入输出到文件
-mMODE,--mode = MODE交互模式: '新手', '中间',[默认], '专家' 之一

危险选项:小心:使用 这些选项需要您自担风险。它被认为是其中一些咬人。 -g组选项。

看一看here

+0

感谢您的快速帮助!如果我想让示例出现在常规使用摘要下方,该怎么办? – CarpeNoctem 2009-12-07 01:54:38

+0

立即试用OptionGroup,谢谢! – CarpeNoctem 2009-12-07 01:59:03

2

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

参见16.4.3.1. Creating the parser

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秒。

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

11

在阐述获奖的答案(这帮助我解决我自己的代码相同的问题),一个快速和肮脏的方法是直接覆盖类的方法与身份的方法:

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

到获取帮助文本打印为逐字结语。

我认为这覆盖了程序中OptionParser类的所有用途的epilog格式,但是,所有这些epilogs都必须在您的程序的其他地方使用OptionParser时逐字传递。

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 "" 
相关问题