md模块可以用来做交互式shell
cmd模块是python中包含的一个公共模块,用于交互式shell和其他命令解释器等的基类,我们可以基于cmd模块自定义我们的子类,实现我们自己的交互式shell
它的执行流程也很简单,使用命令行解释器循环读取输入的所有行并解析他们,然后把输入行交给命令处理器来处理。
命令行解释器接收并解析输入行,这里先需要知道输入行包含两个部分,命令和参数,通过继承和子类方法重载父类方法的特征,命令行处理器找到合适处理该命令的子类方法
比如我们输入的是hello baby,那么我们就重写do_hello的函数,若处理方法返回TRUE,则直接退出循环
简单代码示例
#!/usr/bin/env python2.6
# coding: utf-8
import sys
import os
from cmd import Cmd
class Cli(Cmd):
def __init__(self):
Cmd.__init__(self)
def do_hello(self, line):
print "hello: ",line
if __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-8
import sys,os
from 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