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;

運用這個小技巧不但可以通過指令結束,還可以在調試的時候手動結束,很方便。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章