python笔记之Cmd模块

时间:2022-08-28 00:22:20

python笔记之Cmd模块

	Cmd类型提供了一个创建命令行解析器的框架,默认情况下,它使用readline来进行交互式操作、命令行编辑和命令完成.
使用cmd创建的命令行解释器循环读取输入的所有行并且解析它们,然后发送命令给一个合适的命令处理器。输入行为解析成两个部分:命令和参数。如果用户输入cmd param,它解释成命令cmd和参数param,然后使用param作为参数调用do_cmd方法。如果do_cmd命令处理器返回真,那么程序会干净的退出,否则会继续等待下一个命令的输入。
简单的来说,可以继承Cmd来创建命令行界面,然后对所有想处理的命令command执行do_command方法。这个方法会接受命令行的其余部分作为自己的唯一参数。比如,如果在命令行中输入:
say hello
do_say方法会连同作为唯一参数的字符串"hello"一起调用。

Cmd一些常用的方法

	cmdloop():类似与Tkinter的mainloop,运行Cmd解析器;
onecmd(str):读取输入,并进行处理,通常不需要重载该函数,而是使用更加具体的do_command来执行特定的命名;
emptyline():当输入空行时调用该
default(line):当无法识别输入的command时调用该方法;
completedefault(text,line,begidx,endidx):如果不存在针对的complete_*()方法,那么会调用该函数
precmd(line):命令line解析之前被调用该方法;
postcmd(stop,line):命令line解析之后被调用该方法;
preloop():cmdloop()运行之前调用该方法;
postloop():cmdloop()退出之后调用该方法;

例子

import cmd
import string, sys
class CLI(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = '> '
def do_hello(self, arg):
print "hello again", arg, "!"
def help_hello(self):
print "syntax: hello [message]",
print "-- prints a hello message"
def do_quit(self, arg):
sys.exit(1)
def help_quit(self):
print "syntax: quit",
print "-- terminates the application" # shortcuts
do_q = do_quit # try it out
cli = CLI()
cli.cmdloop() >>> help
Documented commands (type help <topic>):
========================================
hello
quit
Undocumented commands:
======================
help
q
>>> hello world
hello again world !
>>> q

打印目录文件或目录的例子

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]

python笔记之Cmd模块的更多相关文章

  1. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  2. python笔记之subprocess模块

    python笔记之subprocess模块 [TOC] 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spaw ...

  3. 13&period;python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  4. python笔记之bisect模块

    python笔记之bisect模块 当你决定使用二分搜索时,这个模块会给你带来很大的帮助. 例子 import bisect L = [1,3,3,6,8,12,15] x = 3 #在L中查找x,x ...

  5. python笔记之itertools模块

    python笔记之itertools模块 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生 ...

  6. python笔记之ZipFile模块

    python笔记之ZipFile模块 zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下, ...

  7. 【Python】使用cmd模块构造一个带有后台线程的交互命令行界面

    最近写一些测试工具,实在懒得搞GUI,然后意识到python有一个自带模块叫cmd,用了用发现简直是救星. 1. 基本用法 cmd模块很容易学到,基本的用法比较简单,继承模块下的Cmd类,添加需要的功 ...

  8. python笔记06-----常用模块(time,os,sys,random)

    模块 1. 模块的定义和导入 定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py对应的模块名:test) ...

  9. 15&period;python笔记之psutil模块

    一.psutil模块 1. psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等) ...

随机推荐

  1. sql 删除重复数据且保留其中一条 用sql 关键字:with ROW&lowbar;NUMBER

    --1.建立表:Coursecreate table Course( ID int identity(1,1),--ID Student varchar(20) ,--学生 Sub varchar(2 ...

  2. eclipse使用tomcat进行部署时编译代码不一致的处理

    操作步骤: 1. 先add and remove 去除项目 2. clean 完成清除工程在tomcat的目录 3. project-->clean 4. add adn remove 重新添加 ...

  3. C&num;中部分方法返回值类型为什么只能是void?

    这个问题答案选至<C#入门经典> 如果方法具有返回类型,那就可以作为表达式的一部分: x=Manipulate(y,z); 如果没有给部分方法提供实现代码,编译器就会在使用该方法的所有地方 ...

  4. NSS&lowbar;01 开始

    工作中一直使用asp.net webform, 最近有一个新的小项目, 决定用asp.net mvc3, 边学习边工作吧,记录一下开发过程中的问题,因为工作嘛,只记录问题,可能不会很详细. 准备使用a ...

  5. UrlRewriteFilter 美化器的使用方法 伪静态化的解决方案(转)

    一,URL美化器简介 UrlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite.适用于任何Web应用服务器(如Resin,Orion,Tomcat ...

  6. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  7. 3390&colon; &lbrack;Usaco2004 Dec&rsqb;Bad Cowtractors牛的报复

    3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 69  Solved:  ...

  8. angularJS插入html及更换iframe的src

    html: ng-bind-html <div class="tabs_content" ng-bind-html="specialHtml">&l ...

  9. &lbrack;c&sol;c&plus;&plus;&rsqb; programming之路(18)、动态分配内存malloc

    一.图解堆栈 #include<stdio.h> #include<stdlib.h> #include<Windows.h> void main0(){ **]; ...

  10. VS2013&sol;VS2015&sol;VS2017通过oschina托管代码

    1.到http://git.oschina.net注册账号,创建项目,这一步不做详细描述,创建后效果如图 2.打开VS创建项目,为了测试,创建一个空白解决方案 3.把解决方案添加到源代码管理(这一步仅 ...