# coding=utf-8
from cmd import Cmd
import os
import sys
class Client(Cmd):
"""help
這是doc
"""
prompt = 'pyFun>' # 自定義交互式提示字符串
intro = 'Welcom to pyFun!' # 自定義歡迎語
def __init(self):
reload(sys)
sys.setdefaultencoding('utf-8')
Cmd.__init__(self)
def do_hello(self, arg):
print 'hello', arg
def do_exit(self, arg):
print 'Bye!'
return True # 返回True,直接輸入exit命令將會退出
def preloop(self):
print "print this line before entering the loop"
def postloop(self):
# print 'Bye!'
print "print this line after leaving the loop"
def precmd(self, line):
print "print this line before do a command"
return Cmd.precmd(self, line)
def postcmd(self, stop, line):
print "print this line after do a command"
return Cmd.postcmd(self, stop, line)
def default(self, line): # 當無法識別輸入的command時調用該方法;
arg = line.strip().split()
print arg
def do_EOF(self, line):
return True
pass
def do_setparam(self, line):
args = line.strip().split()
if len(args) < 3:
print 'set param'
print 'args=', args
print len(args)
print 'param_1:', args[0], 'param_2:', args[1]
def do_dir(self, arg):
if not arg:
self.help_dir()
elif os.path.exists(arg):
print"\n".join(os.listdir(arg))
else:
print "No such pathexists."
def help_dir(self):
print "syntax: dir path -- displaya list of files and directories"
def emptyline(self): # 當輸入空行的時候
pass
if __name__ == '__main__':
try:
os.system('cls')
client = Client()
client.cmdloop()
except:
exit()
1、簡介
cmd模塊是python中包含的一個公共模塊,用於交互式shell和其它命令解釋器等的基類。我們可以基於cmd模塊自定義我們的子類,實現我們自己的交互式shell。
它的執行流程也挺簡單的,使用命令行解釋器循環讀取輸入的所有行並解析它們,然後把輸入行交給命令處理器來處理。命令行處理器接收並解析輸入行,這裏先需要知道輸入行包括兩個部分:命令和參數。通過繼承和子類方法重載父類方法的特性,命令行處理器找到適合處理該命令的子類方法。
比如我們輸入的是hello baby,那麼我們就重寫名爲do_hello的函數。倘若處理方法返回True,則直接退出循環。
簡例:
from cmd import Cmd
import os
import sys
class Cli(Cmd):
def __init(self):
Cmd.__init__(self)
def do_hello(self,line):
print "hello",line
if __name__ == '__main__':
cli = Cli()
cli.cmdloop()
輸出:
2、主要方法和屬性
在認識了cmd模塊的主要運行流程,下面就認識一下它的主要函數與及一些我們需要用到的屬性。
方法:
(1)cmdloop():類似與Tkinter的mainloop,運行Cmd解析器;
(2)onecmd(str):讀取輸入,並進行處理,通常不需要重載該函數,而是使用更加具體的do_command來執行特定的命令;
(3)emptyline():當輸入空行時調用該方法;
(4)default(line):當無法識別輸入的command時調用該方法;
(5)completedefault(text,line,begidx,endidx):如果不存在針對的complete_*()方法,那麼會調用該函數,該函數主要是用於tab補充,且只能在linux下使用。
(6)precmd(line):命令line解析之前被調用該方法;
(7)postcmd(stop,line):命令line解析之後被調用該方法;
(8)preloop():cmdloop()運行之前調用該方法;
(9)postloop():cmdloop()退出之後調用該方法;
(10)help_command():對command命令的說明,其中command爲可變字符
屬性:
(1)prompt:交互式提示字符,也就是剛纔的(Cmd)可以換成我們自己想要的字符
(2)intro:在進入交互式shell前輸出的字符串,可以認定爲標誌語之類的。其實這個可以在preloop方法輸出也是一樣的
3、相關說明
1、使程序能夠正常接收ctrl+c的退出方式
try:
os.system('cls')
client = Client()
client.cmdloop()
except:
exit()
在我按下ctrl+c之後能夠正常退出不報錯
2、EOF是一個計算機術語,爲End Of File的縮寫,在操作系統中表示資料源無更多的資料可讀取。資料源通常稱爲檔案或串流。
而在不同系統的EOF所代表的值是不一樣的,在Visual Studio 2017下爲ctrl+c,windows下爲ctrl+z,linux/unix下爲ctrl+c或ctrl+d;
運用這個小技巧不但可以通過指令結束,還可以在調試的時候手動結束,很方便。