python optparse,如何在使用输出中包含其他信息?

Car*_*tem 26 python optparse

使用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
Run Code Online (Sandbox Code Playgroud)

我想在我的工作中包含较少*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
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?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()
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 42

parser = optparse.OptionParser(epilog="otherstuff")
Run Code Online (Sandbox Code Playgroud)

默认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
""")
...
Run Code Online (Sandbox Code Playgroud)

这里有更多细节.
如果您查看optparse.py该类OptionParser,则会调用format_epilog一个名为by的方法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)
Run Code Online (Sandbox Code Playgroud)

默认行为formatter.format_epilog是使用textwrap.fill除了其他内容之外,从epilog中删除换行符.由于我们希望保留换行符,因此我们将子类化OptionParser并更改其行为format_epilog

  • epilog似乎是在2.4之后添加的:( (2认同)

use*_*529 12

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

optparse.OptionParser.format_epilog = lambda self, formatter: self.epilog
optparser = optparse.OptionParser(epilog=helptext)
Run Code Online (Sandbox Code Playgroud)

获取帮助文本打印为逐字的结语.

我认为这会覆盖程序中OptionParser类的所有用法的epilog格式,但是,所有这些epilog必须逐字传递,在程序中的其他位置使用OptionParser.


jld*_*ont 5

使用usage参数:

usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)
Run Code Online (Sandbox Code Playgroud)

您可以添加更多(仅作为示例):

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)
Run Code Online (Sandbox Code Playgroud)

示例输出:

用法:[options] arg1 arg2

选项:-h, - help显示此帮助消息并退出
-v, - verbose产生大量噪音[默认]
-q, - 静音(我正在寻找wabbits)
-fFILE, - file = FILE写输出到FILE
-mMODE, - mode = MODE交互模式:'新手','中间',[默认],'专家'之一

危险选项:注意:使用这些选项的风险由您自行承担.据信其中一些人咬人.-g组选项.

看看这里.