使用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()
答案 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
之后但在选项列表之前显示的任意文本。
答案 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 ""