如何使用OptionParser制作自定义命令行界面?

2 投票
3 回答
2321 浏览
提问于 2025-04-15 15:54

我正在使用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 模块,它可以帮助你写出像这样的命令循环。

撰写回答