如何使用Python设置位置参数帮助的格式';什么是optpass?

如何使用Python设置位置参数帮助的格式';什么是optpass?,python,command-line,formatting,command-line-arguments,optparse,Python,Command Line,Formatting,Command Line Arguments,Optparse,正如在optparse.OptionParser中提到的,OptionParser使用IndentedHelpFormatter输出格式化的选项help,我找到了一些 我想在用法文本中为所需的位置参数显示格式类似的帮助文本。是否有适配器或简单的使用模式可用于类似的位置参数格式 澄清 最好仅使用stdlib。Optparse做得很好,除了这个格式上的细微差别,我觉得我们应该能够在不导入整个其他软件包的情况下修复它。:-) 大多数位置参数的帮助文本类似于*NIX框手册页中经常使用的格式。看一看。您的

正如在
optparse.OptionParser
中提到的,OptionParser使用
IndentedHelpFormatter
输出格式化的选项help,我找到了一些

我想在用法文本中为所需的位置参数显示格式类似的帮助文本。是否有适配器或简单的使用模式可用于类似的位置参数格式

澄清
最好仅使用stdlib。Optparse做得很好,除了这个格式上的细微差别,我觉得我们应该能够在不导入整个其他软件包的情况下修复它。:-)

大多数位置参数的帮助文本类似于*NIX框手册页中经常使用的格式。看一看。您的帮助文本应该类似于此


否则,只要您在使用解析器时填写“help”参数,文档就会自动生成。

我希望有一个干净的解决方案;我没能想出一个。OptionParser实际上完全关注选项;就我所能找到的而言,它没有给你任何与位置参数相关的东西

我所做的是为每个位置参数生成一个小文档块列表,使用
\t
s获得正确的间距。然后我用换行符将它们连接起来,并将其附加到传递给OptionParser的“usage”字符串中

它看起来不错,但感觉很傻,当然,文档最终会出现在选项列表的上方。我没有找到任何方法来解决这个问题,也没有找到如何做任何复杂的事情,例如,在位置参数的描述下面描述了一组给定的选项,因为它们只适用于该参数


我看了monkey patching OptionParser的方法,我记得(这是一年前左右的事)这不会那么困难,但我不想走这条路。

试着看一下。文档说明它支持位置参数和外观更好的帮助消息。

最好的办法是为optparse模块编写补丁。同时,您可以通过稍微修改OptionParser类来实现这一点。这并不完美,但它会满足你的要求

#!/usr/bin/env python
from optparse import OptionParser, Option, IndentedHelpFormatter

class PosOptionParser(OptionParser):
    def format_help(self, formatter=None):
        class Positional(object):
            def __init__(self, args):
                self.option_groups = []
                self.option_list = args

        positional = Positional(self.positional)
        formatter = IndentedHelpFormatter()
        formatter.store_option_strings(positional)
        output = ['\n', formatter.format_heading("Positional Arguments")]
        formatter.indent()
        pos_help = [formatter.format_option(opt) for opt in self.positional]
        pos_help = [line.replace('--','') for line in pos_help]
        output += pos_help
        return OptionParser.format_help(self, formatter) + ''.join(output)

    def add_positional_argument(self, option):
        try:
            args = self.positional
        except AttributeError:
            args = []
        args.append(option)
        self.positional = args

    def set_out(self, out):
        self.out = out
def main():
    usage = "usage: %prog [options] bar baz"
    parser = PosOptionParser(usage)
    parser.add_option('-f', '--foo', dest='foo',
                      help='Enable foo')
    parser.add_positional_argument(Option('--bar', action='store_true',
                                   help='The bar positional argument'))
    parser.add_positional_argument(Option('--baz', action='store_true',
                                   help='The baz positional argument'))
    (options, args) = parser.parse_args()
    if len(args) != 2:
        parser.error("incorrect number of arguments")
    pass

if __name__ == '__main__':
    main()
以及运行此命令所获得的输出:

Usage: test.py [options] bar baz

  Options:
    -h, --help         show this help message and exit
    -f FOO, --foo=FOO  Enable foo

Positional Arguments:
  bar  The bar positional argument
  baz  The baz positional argument

您不能为位置参数指定帮助,除非我在这里遗漏了一些主要内容。我希望它看起来就像生成的“选项”部分。我认为手工格式化是愚蠢的,所以如果它还不存在,我可能会为我写一些东西。是的,我同意排序,但我的用法文本为位置参数命名,我希望名称解释对在参数和选项部分看起来相同。感谢指针,但如果可能的话,我更愿意去stdlib。这似乎并不是一个很难解决的问题,我应该下载并捆绑一个完整的其他选项包来完成它。
argparse
在2.7标准lib中,这真是太棒了。不过有一个小问题:您是否可以检测到用户是否设置了用法或使用了默认值,如果是,请将位置参数添加到用法消息中?我建议您查看argparse模块。。。它足够小,你可以将它嵌入到任何项目中,并且做与此代码相同的事情,还有更多……这真是太遗憾了,我现在也遇到了同样的问题。