0X00 前言

在早前用别人的工具时,发现有些大佬会用到交互式shell,那时候就挺好奇的,但是一直都没有看一下怎么做到的。

今天在翻p牛的博客的时候,看到他早之前写的一个工具就有用到交互式shell,看了看源码,发现是用到了一个叫做cmd的模块。

就想写篇博文记录一下,也好补充一下自己python标签的文章~

0X01 简介

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()

输出效果

0x02 cmd的主要方法和属性

在认识了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方法输出也是一样的

下面用一个比较完整的代码来举例:

 from cmd import Cmd
import os
import sys class Client(Cmd):
u"""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) if __name__ == '__main__':
try:
os.system('cls')
client = Client()
client.cmdloop()
except:
exit()

运行效果:

0x03 一些情况下的使用

下面针对一些特定情况进行一些示例

1,当输入空行的时候,我们可以重载emptyline()来处理:

def emptyline(self):
print 'please input command!'

2,自定义我们自己的交互式提示字符串

prompt = 'pyFun>'

3,自定义我们的欢迎语:

intro = 'Welcom to pyFun!'

4,使程序能够正常接收ctrl+c的退出方式

try:
os.system('cls')
client = Client()
client.cmdloop()
except:
exit()

在我按下ctrl+c之后能够正常退出不报错

5,当输入无法识别的命令时,使用default(line)来处理:

0x04 总结

其实模块很简单,大伙理解都不会超过十分钟就明白了,但是要写文章截图,认真去讲清楚才是最费时间的。但这样学到的东西才是最深刻的。

这篇算是开坑,以后会一直去学习、记录一些python有趣的库。

简单认识python cmd模块的更多相关文章

  1. python cmd模块练习

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

  2. python cmd 模块

    command模块用于执行以字符串形式指定的简单系统命令,并将其输出以字符串形式返回.此模块尽在unix系统上有效.这个模型提供的功能与在unix shell脚本使用的反引号(就是~这个键下的那个反引 ...

  3. Python cmd库的简易使用

    简单记录一下,竟然这么简单的方法就能在 python 里面实现一个简单的交互式命令行以前从来没有尝试过. 上一个完整的例子: import cmd import osimport readline r ...

  4. python笔记之Cmd模块

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

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

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

  6. python之cmd模块

    md模块可以用来做交互式shell cmd模块是python中包含的一个公共模块,用于交互式shell和其他命令解释器等的基类,我们可以基于cmd模块自定义我们的子类,实现我们自己的交互式shell ...

  7. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  8. python shutil模块简单介绍

    python shutil模块简单介绍 简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作. shutil 模块方法: copy(src, ...

  9. python爬虫:爬虫的简单介绍及requests模块的简单使用

    python爬虫:爬虫的简单介绍及requests模块的简单使用 一点点的建议: (学习爬虫前建议先去了解一下前端的知识,不要求很熟悉,差不多入门即可学习爬虫,如果有不了解的,我也会补充个一些小知识. ...

随机推荐

  1. PHP去除unicode续:json_encode之后,仅仅有文字,数字不见了的解决方法

    接前文.http://blog.csdn.net/yanzi1225627/article/details/44985487 这么处理了一段时间.确实没发现问题.但近期发现了一个bug.比方输入&qu ...

  2. Cocos2d-X使用CCAnimation创建动画

    动画在游戏中是很常见的 程序1:创建一个简单的动画 首先须要在project文件夹下的Resource文件夹中放一张有各种不同动作的图片 在程序中加入以下的代码 #include "Anim ...

  3. 论文笔记:Chaotic Invariants of Lagrangian Particle Trajectories for Anomaly Detection in Crowded Scenes

    [原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 近期在关注 crowd scene方面的东西.由于某些原因须要在crowd scen ...

  4. nginx+redis缓存微信的token数据

    上一篇文章我们讲了如何在负载均衡的项目中使用redis来缓存session数据,戳这里. 我们在项目的进展过程中,不仅需要缓存session数据,有时候还需要缓存一些别的数据,比如说,微信的acces ...

  5. 自学Zabbix3.10.1.3-事件通知Notifications upon events-媒介类型Jabber

    自学Zabbix3.10.1.3-事件通知Notifications upon events-媒介类型Jabber Jabber有第三方插件,能让Jabber用户和MSN.YahooMessager. ...

  6. 使用MVC创建API

    1.新建MVC-WebAPI 2.Build后页面是这样的,这就是我们需要的页面. 3.自己Add API的页面,然后Run,会发现页面没有action和Description 4.显示action, ...

  7. 《Spark大数据处理:技术、应用与性能优化》【PDF】 下载

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  8. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...

  9. 快速学习Bash

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. Shell是Linux下经典的文本互动方式,而Bash是现在最常用的一种Shell.我在这里总结了Bash ...

  10. Akka Serialization

    Akka本身使用了Protocol Buffers来序列化内部消息(比如gossip message).Akka系统还可以配置自定义序列化机制. 配置conf akka { actor { ## 在a ...