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

python之cmd模块的更多相关文章

  1. Python的Cmd模块的简易运用学习

    昨天大佬阿炳给发了一份代码给我,看着感觉很好玩,这是自己写了个命令行吗,完了我就找篇更详细一点的博客学习了一下  cmd的主要方法和属性 方法: (1)cmdloop():类似与Tkinter的mai ...

  2. python笔记之Cmd模块

    python笔记之Cmd模块 Cmd类型提供了一个创建命令行解析器的框架,默认情况下,它使用readline来进行交互式操作.命令行编辑和命令完成. 使用cmd创建的命令行解释器循环读取输入的所有行并 ...

  3. 简单认识python cmd模块

    0X00 前言 在早前用别人的工具时,发现有些大佬会用到交互式shell,那时候就挺好奇的,但是一直都没有看一下怎么做到的. 今天在翻p牛的博客的时候,看到他早之前写的一个工具就有用到交互式shell ...

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

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

  5. python cmd模块练习

    # encoding=utf-8 import cmd import sys # cmd模块练习 class Client(cmd.Cmd): ''' 1)cmdloop():类似与Tkinter的m ...

  6. 【循序渐进学Python】10.模块和包

    1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...

  7. python基础之模块之os模块

    os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/删除某个文件/获取文件大小…… 另 ...

  8. 第四章:4.0 python常用的模块

    1.模块.包和相关语法 使用模块好处: 最大的好处是大大提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Pyt ...

  9. 安装python的pip模块

    安装python的pip模块 网址https://pypi.python.org/pypi/pip 选择,点击下载 将文件解压到C:\Users\Administrator\AppData\Local ...

随机推荐

  1. [每日一学]apache camel|IBMWebsphere MQ header issue|MQRFH2 |MQSTR

    最近工作中,遇到一个很奇怪的问题: 现象:在camel开发中,通过 IBM Websphere MQ 给assasin 发送xml的message时,会多出<mcd>等这样的header出 ...

  2. 强大的VS插件CodeRush发布v19.1.4|支持Visual Studio 2019

    CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验. [CodeRush for Visual Studio v19.1. ...

  3. Django【第11篇】:Django之分页升级版本(组件)

    分页组件 一.分页的实现与使用 class Pagination(object): """ 自定义分页 """ def __init__(s ...

  4. 认识js数组

    1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维数 ...

  5. 在asp.net 中怎样上传文件夹

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  6. Leetcode 2. Add Two Numbers(指针和new的使用)结构体指针

    ---恢复内容开始--- You are given two non-empty linked lists representing two non-negative integers. The di ...

  7. UVALive 6862 Triples (找规律 暴力)

    Triples 题目链接: http://acm.hust.edu.cn/vjudge/contest/130303#problem/H Description http://7xjob4.com1. ...

  8. SDK使用NinePatch(.9)资源

    .9资源是啥? .9图是一种可以拉伸的图片格式,当你把它用作背景图时,android系统会根据实际情况来拉伸图片资源.比如按钮的背景必须根据上面显示文字的长短作拉伸.NinePatch就是额外包含了一 ...

  9. Linux添加目录到环境变量以及添加Sublime Text到环境变量

    本文主要介绍了Linux添加目录到环境变量以及添加Sublime Text到环境变量,通过具体的解释说明,让我们从中学到Linux添加目录到环境变量以及添加Sublime Text到环境变量的精髓所在 ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_14-ArrayList集合的常用方法和循环

    常用的方法记下来 刚创建好,什么都不放的 add添加方法肯定是成功的. 加了这么多的值都没有用返回值,输出的结果可以看到都是添加成功的 获取索引值 ALT+回车键,推荐使用本地变量去接收 这样左边就会 ...