Python cmd库的使用

# 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;

运用这个小技巧不但可以通过指令结束,还可以在调试的时候手动结束,很方便。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/craftsman2020/article/details/107307422