2016-02-04 54 views
-1

我正在嘗試爲我正在使用的只是標準python軟件包編寫的IRC客戶端創建一個CLI。我一直在Python中使用本地cmd庫,它適合我的需求(現在),但有一個問題我無法修復。使用Python標準庫中的cmd在Python CLI中的命令前綴

在cmd庫中包含一個命令前綴有一個公共實例變量,但是我不能讓我的生活正常工作;它只是給了我一個「未知的語法」錯誤。這裏的目標是'/ help'或其他帶有/前綴的命令會調用該方法,只需輸入'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

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!") 
+0

沒關係啊,我該變量的解釋是路要走。感謝您的解決方案! – ArcadeJL