正确帮助争论

时间:2009-12-09 19:37:25

标签: python optparse

当脚本使用类似于

时,Python optparse非常有用
%prog [options] [args]

但是我需要用1个必需参数为脚本编写帮助,所以用法就像这样

%prog action [options] [args]

使用Subversion时可以看到类似的东西 - 它的用法字符串是

svn <subcommand> [options] [args]

所以我的问题是:是否有可能以Subversion的方式为optparse准备所需参数的帮助?因此,我希望看到这样的帮助:

Usage: python myscript.py action [options] [args]

Available actions:
  foo
  bar

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -v, --verbose         Verbose mode. Output debug log to stdout.

3 个答案:

答案 0 :(得分:7)

我认为一个很好的解决方案是argparse,已经proposed for inclusion in Python 2.7 and 3.2。它处理子命令,我相信你想要的,链接的页面包含一个链接到一个从optparse移植代码的页面。

另请参阅问题command-line-arguments-in-python,有人编辑了一个参考列表,其中包含的内容与您想要的完全相同:

答案 1 :(得分:2)

是。您可以像这样设置用法字符串:

usage = "%prog action [options] [args]"
parser = OptionParser(usage=usage)
parser.add_option("-v", "--verbose",
                  action="store_true", dest="verbose", default=True,
                  help="make lots of noise [default]")

打印以下内容:

Usage:  action [options] [args]

Options:
  -h, --help     show this help message and exit
  -v, --verbose  make lots of noise [default]

这几乎是从the docs逐字复制的。

修改

根据您的评论,您可以使用说明来实现类似的功能,但不能在其中添加换行符。

parser.description = 'Available actions: foo, bar'

看起来像这样:

Usage:  action [options] [args]

Available actions: foo, bar

Options:
  -h, --help     show this help message and exit
  -v, --verbose  make lots of noise [default]

答案 2 :(得分:0)

我也遇到过这个问题。我的解决方案是在列表或元组中声明命令,将它们格式化为OptionParser的usage参数,然后使用解析器提供的args列表来确定是否提供了命令,因为它在技术上必须是args[0]。例如:

self.commands = ('foo', 'bar' ...)
self.parser = <initialized instance of OptionParser>
(self.options, self.args) = parser.parse_args()

if len(self.args) == 0:
   self.parser.error("Command required")

self.command = self.args[0]
if not self.command in self.commands:
   self.parser.error("Command not recognized")

#... etc

这种方式会让你看起来像Subversion的命令系统,但不可否认,optparse可能会更好。我听说 argparse 模块应该进入stdlib,但2.7是2系列发行版中的最后一个,我想你必须等到它被合并到3 。X。当然你可以安装argparse,但在某些情况下这是拖累。