python之cmd模块

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

原文地址:https://www.cnblogs.com/yyf573462811/p/9566919.html