python optparse,如何在使用信息中包含额外信息?

26 投票
6 回答
17409 浏览
提问于 2025-04-15 16:44

我想用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()

6 个回答

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)

示例输出:

用法: [选项] 参数1 参数2

选项: -h, --help 显示这个帮助信息并退出
-v, --verbose 输出很多信息 [默认选项]
-q, --quiet 非常安静(我在打猎兔子)
-fFILE, --file=FILE 将输出写入 FILE
-mMODE, --mode=MODE 交互模式:可以是 'novice'(新手)、'intermediate'(中级)、[默认]、'expert'(专家)

危险选项: 注意:使用这些选项风险自负。相信有些选项会带来麻烦。 -g 组选项。

可以在 这里 查看更多信息。

12

进一步解释一下获胜答案(它帮助我解决了自己代码中的同样问题),一个简单粗暴的办法是直接用一个身份方法来覆盖这个类的方法:

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

这样可以让帮助文本以原样的形式打印出来,作为结尾部分。

不过,我觉得这样会覆盖你程序中所有使用OptionParser类的地方的结尾格式,所以在你程序的其他地方使用OptionParser时,所有这样的结尾都必须原样传入。

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.fill,这个方法会去掉 epilog 中的换行符。因为我们希望保留换行符,所以我们需要创建一个 OptionParser 的子类,并改变 format_epilog 的行为。

撰写回答