使用Python标准库中的cmd在Python CLI中使用命令前缀

时间:2016-02-04 22:44:19

标签: python interface command line

我试图为IRC客户端创建一个CLI,我只使用标准的python包编写。我一直在python中使用原生cmd库,它可以很好地满足我的需求(目前),但有一个问题我无法修复。

有一个公共实例变量,用于在cmd库中包含命令前缀,但我不能让我的生活让它正常工作;它只是给了我一个"未知语法"错误。这里的目标是' / help'或者带有/前缀的其他命令会调用该方法,只需输入'帮助'会发送"帮助"到服务器。

以下是我的代码中正在进行的CLI类:

class lircCLI(Cmd):

    intro = 'Welcome to LIRC \nType help or ? for command list'
    prompt = 'lirc> '
    identchars = '/'   << the problem 


     #---------commands-----------

    def do_sync(self):
        'Force synchronize with the IRC server'
        connectionHandler.syncMessages()

    def do_whoami(self, arg):
        'Good question'
        print(user.getName())

    def do_changename(self, arg):
         'Change your name'
         user.setName(arg)
         print("Username has been changed to '"+user.name+"'")

    def default(self, line):
         'Sends a message'
         #compiles message request
         message = str(user.getName().replace(" ", "_") + " SHOUTS " + line + " END")
         connectionHandler.sendMessage(message)
         logHandler.updateChatLog({time.strftime("%d/%m/%Y") : {'time': time.strftime("%I:%M:%S"), 'user': user.getName(),'text': line}})

1 个答案:

答案 0 :(得分:1)

identchars属性实际上定义了可以从中绘制命令的字符集。它的默认值几乎是“ascii chars”。

您要做的是使用.precmd方法来反转正常处理。寻找一个领先的斜线,如果找到剥离它。如果未找到,则前缀一些无效前缀或某些“默认”命令名称。这些都可以起作用:

def precmd(self, line):
    if line[0] == '/':
        line = line[1:]
    else:
        line = '>' + line
    return line

def default(self, line):
    line = line[1:]
    print("You said, '"+line+"'")

或者:

def precmd(self, line):
    if line[0] == '/':
        line = line[1:]
    else:
        line = 'say ' + line
    return line

def do_say(self, arg):
    print("You said, '"+arg+"'")

def default(self, line):
    raise ValueError("Inconceivable!")