当脚本使用类似于
时,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.
答案 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,但在某些情况下这是拖累。