2

当脚本使用是这样的时候,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.
4

3 回答 3

7

我认为对您来说一个好的解决方案是argparse,它已被提议包含在 Python 2.7 和 3.2中。我相信它可以处理子命令,并且链接的页面包含指向从 optparse 移植代码的页面的链接。

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

于 2009-12-09T19:45:39.597 回答
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]

这几乎是从文档中逐字复制的。

编辑:

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

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]
于 2009-12-09T19:43:05.843 回答
0

我也遇到过这个问题。我的解决方案是在列表或元组中声明命令,将它们格式化usage为 OptionParser 的参数,然后使用解析器提供的 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,但在某些情况下这是一个拖累。

于 2009-12-09T20:01:59.153 回答