2009-12-07 78 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 "" 
相關問題