是否有一种简单的方法可以将值添加到python3 cmd.Cmd?

时间:2012-08-28 00:09:26

标签: python python-3.x

是否有一种简单的方法可以将带有值的参数添加到python3的{​​{3}}?

例如,使用简单参数实现命令很容易:

> action1 param1 param2

通过添加do_action1()complete_action1()来完成,我可以搜索现有参数列表。

但是如何使用值实现参数,例如:

> action1 param1=234 param2=SomeTextValue

> action1 param1 234 param2 SomeTextValue

其中param1设置为234param2设置为SomeTextValue

这可以由cmd.Cmd解析吗?

我只能考虑在do_action1( self, params = None )中获取整个参数列表,然后自己解析它。

如果我使用optparse,则参数必须以-p--param1--param2之类的短划线为前缀,以便在cmd.Cmd中完成首先要输入2个破折号......

> action1 --param1=234 --param2=SomeTextValue

如果我必须手动解析参数是否有像optparse那样的python3模块,它不希望参数有2个短划线前缀?

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

好吧,无论如何,cmd.Cmd实际上并没有为你做很多解析。所以,是的,您可以通过使用尾随=完成参数并自行解析命令来处理带参数的参数:

import cmd

def parse(arg):
    return tuple(k.partition('=') for k in arg.split())

class MyShell(cmd.Cmd):
    def do_foo(self, arg):
        for x, _, y in parse(arg):
            print(x, y)

    def complete_foo(self, text, line, begidx, endidx):
        # Cmd treats = as the end of params; we don't want that.
        if line.endswith('='):
            return ()

        opts = ['param1=', 'param2', 'param3=']
        return [opt for opt in opts if opt.startswith(text)]

MyShell().cmdloop()

使用示例:

(Cmd) foo param<TAB>
param1=  param2   param3=  
(Cmd) foo param1=a param
param1=  param2   param3=  
(Cmd) foo param1=a param2 param3=ah
param1 a
param2 
param3 ah

请注意,我们的完成包含一个尾随=作为用户的提示,让他们知道可以传递参数。