# 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;
运用这个小技巧不但可以通过指令结束,还可以在调试的时候手动结束,很方便。