Python中cmd模块的使用说明

    Python中包含一个公共类cmd,它可以用于交互式shell和其它命令解释器等的基类。默认情况下,它使用readline来进行交互式操作、命令行编辑和命令完成。

使用cmd创建的命令行解释器循环读取输入的所有行并且解析它们,然后发送命令给一个合适的命令处理器。输入行为解析成两个部分:命令和参数。如果用户输入cmd param,它解释成命令cmd和参数param,然后使用param作为参数调用do_cmd方法。如果do_cmd命令处理器返回真,那么程序会干净的退出,否则会继续等待下一个命令的输入。

一个简单的打印目录文件或目录的例子:

#-*- coding:gbk-*-

import cmd

import os

import sys

 

classCLI(cmd.Cmd):

    def __init__(self):

        cmd.Cmd.__init__(self)

        self.prompt = "> "    # define command prompt

 

    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 do_quit(self, arg):

        return True

 

    def help_quit(self):

        print "syntax: quit -- terminatesthe application"

 

    # define the shortcuts

    do_q = do_quit

 

if __name__ =="__main__":

    cli = CLI()

    cli.cmdloop()

 

         上面的代码中self.prompt用于修改命令行的提示符。

说明:在cmd.Cmd派生类中,以do_*开头为命令,以help_*开头的为帮助,成员函数的__doc__可以用作为帮助说明。

         可以使用self.intro = “Welcomemessage”来输出欢迎信息。

当打印帮助的时候,使用doc_header、misc_header、undoc_header可以用于格式化输出。

         通过按下TAB可以实现自动完成,多个选项的情况下按下2个TAB键可以实现列出所有选项,自动完成的方法添加前缀complete_。

defcomplete_dir(self, text, line, begidx, endidx):

        if not text:

            completions = ["aaa","bbb", "ccc"]

        else:

            completions = ["ddd","eee",]

        #print completions

        return completions

注意:自动补全只在Linux下有效。

在cmd中几种可以重载的方法,可以用于显示动作或者改变基类的行为。一般而言由于preloop()和postloop()的存在,不需要也没有必要重载cmdloop()方法。

每次迭代cmdloop()和onecmd()来分发命令给处理器时,实际输入行为使用parseline()来解析,创建一个元组包含命令和参数。如果改行为空会调用emptyline()方法。默认实现运行以前的命令,如果改行包含一个命令,首先调用precmd(),然后查找调用处理器的方法,不管有没有找到命令都会调用postcmd()。

为了补充标准命令处理,cmd包含两个特殊命令的前缀,问号(?)相当于内置的帮助命令,感叹号(!)会映射到do_shell(),以运行其它的命令,感叹号需要有do_shell方法才会启用,需要自行添加。

    def do_shell(self, arg):

        "run a shell commad"

        print ">", arg

        sub_cmd = subprocess.Popen(arg,shell=True, stdout=subprocess.PIPE)

        print sub_cmd.communicate()[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值