如何使用OptionParser制作自定义命令行界面?
我正在使用optparse模块中的OptionParser来解析我通过raw_input()获取的命令。
我有以下几个问题。
1.) 我使用OptionParser来解析这个输入,比如说(获取多个参数)
my prompt> -a foo -b bar -c spam eggs
我在add_option()中为'-c'设置了action='store_true',现在如果还有另一个选项有多个参数,比如-d x y z,那么我怎么知道哪个参数是来自哪个选项的呢?还有,如果其中一个参数需要再次解析,比如说
my prompt> -a foo -b bar -c spam '-f anotheroption'
2.) 如果我想做这样的事情……
my prompt> -a foo -b bar
my prompt> -c spam eggs
my prompt> -d x y z
现在每个输入都不能影响之前命令设置的其他选项。我该怎么做到这一点呢?
3 个回答
1
optparse
通过要求每个参数的数量保持一致来解决第一个问题(即使这个数量是0),不允许使用可变数量的参数:
通常,一个选项要么需要一个参数,要么不需要。很多人希望有一个“可选参数”的功能,也就是说,有些选项如果有参数就接受,没有就不接受。这种做法有点争议,因为它会让解析变得模糊:比如如果 "-a" 是一个可选参数,而 "-b" 是另一个完全不同的选项,那么 "-ab" 应该怎么理解呢?由于这种模糊性,optparse 不支持这个功能。
第二个问题的解决办法是,不要重复使用之前的值来调用 parse_args
,这样它会创建一个新的值对象,而不是更新旧的值。
2
你也可以通过使用 nargs
这个选项属性来解决第一个问题,方法如下:
parser = OptionParser()
parser.add_option("-c", "", nargs=2)
parser.add_option("-d", "", nargs=3)
4
对于第二部分:你需要为每一行处理创建一个新的 OptionParser 实例。可以查看一下 cmd 模块,它可以帮助你写出像这样的命令循环。