md模块可以用来做交互式shell
cmd模块是python中包含的一个公共模块,用于交互式shell和其他命令解释器等的基类,我们可以基于cmd模块自定义我们的子类,实现我们自己的交互式shell
它的执行流程也很简单,使用命令行解释器循环读取输入的所有行并解析他们,然后把输入行交给命令处理器来处理。
命令行解释器接收并解析输入行,这里先需要知道输入行包含两个部分,命令和参数,通过继承和子类方法重载父类方法的特征,命令行处理器找到合适处理该命令的子类方法
比如我们输入的是hello baby,那么我们就重写do_hello的函数,若处理方法返回TRUE,则直接退出循环
简单代码示例
#!/usr/bin/env python2.6# coding: utf-8import sysimport osfrom cmd import Cmdclass Cli(Cmd): def __init__(self): Cmd.__init__(self) def do_hello(self, line): print "hello: ",lineif __name__ == '__main__': cli = Cli() cli.cmdloop()
cmd的主要方法和属性
方法:
cmdloop():类似与Tkinter的mainloop,运行Cmd解析器
onecmd(str):读取输入,并进行处理,通常不需要重载该函数,而是使用更加具体的do_command来执行特定的命令
emptyline():当输入空行时调用该方法
default(line):当无法识别输入的command时调用该方法
completedefault(text,line,begidx,endidx):如果不存在针对的complete_*()方法,那么会调用该函数,该函数主要用于Tab补充,且只能在Linux中使用
precmd(line):命令line解析之前调用
postcmd(line):命令line解析之后调用
preloop():cmdloop()运行之前调用
postloop():cmdloop()运行之后调用
help_command():对command命令的说明,其中command为可变字符
属性:
promot:交互式提示字符,也就是刚才栗子中的Cmd可以通过该参数更改
intro:在进入交互式shell前输出的字符串,可以认定为标志语之类的,其实这个可以在preloop方法输出也是一样的
完整代码栗子
#!/usr/bin/env python2.6# coding: utf-8import sys,osfrom cmd import Cmd class Client(Cmd): prompt = 'pyFun>' intro = 'Welcome to pyFun!' def __init(self): reload(sys) sys.setdefaultencoding('utf-8') Cmd.__init__(self) def do_hello(self, line): print "hello: ",line 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 '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 emptyline(self): print 'print input command' def default(line): print 'what a input ?' if __name__ == '__main__': try : os.system('ls') client = Client() client.cmdloop() except: exit()
其他示例
当输入空行的时候,可以重载emptyline()来处理
def emptyline(self): print 'print input command'
自定义我们自己的交互式提示字符串
prompt = 'pyFun>'
自定义欢迎语
intro = 'Welcome to pyFun!'
使程序能正常接收ctrl+c的退出方式
try: os.system('cls') client = Client() client.cmdloop()except: exit()
当输入无法识别的命令时,使用default(line)来处理
def default(self, line): print 'what a input ?'
参考:https://www.cnblogs.com/r00tuser/p/7515136.html