Chinaunix首页 | 论坛 | 博客
  • 博客访问: 474381
  • 博文数量: 65
  • 博客积分: 2645
  • 博客等级: 少校
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-08 17:04
文章分类

全部博文(65)

文章存档

2010年(5)

2009年(5)

2008年(14)

2007年(35)

2006年(6)

分类: Python/Ruby

2010-01-11 16:58:44

最近应用 cmd 模块做了一个小工具,实现了一些小功能:

  • 自动将本地的文件同步到远程主机上(通过 ftplib实现)
  • 到远程主机上执行一下命令(通过 telnetlib 实现)
  • 调用系统中的程序 (通过 os.system("cmd") 实现)
  • 向手机发信息(用了 cocobear 的 pyfetion :) )
  • 自动生成一些代码

期间总是想实现: 一次输入多个命令, cmd 逐个执行的功能.

发了下代码发现: cmd模块的类Cmd中有个成员 cmdqueue.  利用这个成员可以完成我的需求.

cmdqueue 在 __init__ 中初始化了一次,之后在 cmdloop 中引用

    while not stop:
                if self.cmdqueue:
                    line = self.cmdqueue.pop(0)
                else:
                    if self.use_rawinput:
                        try:
                            line = raw_input(self.prompt)
                        except EOFError:
                            line = 'EOF'
                    else:
                        self.stdout.write(self.prompt)
                        self.stdout.flush()
                        line = self.stdin.readline()
                        if not len(line):
                            line = 'EOF'
                        else:
                            line = line[:-1] # chop \n
                line = self.precmd(line)
                stop = self.onecmd(line)
                stop = self.postcmd(stop, line)

当程序执行完一个用户命令后,会判断 cmdqueue 中是否有待执行的命令, 如果有, 则执行.

否则,等待用户输入下一个命令.

BTW:

self.preloop 循环前执行, 你可以在这里加载配置文件、修改 prompt、...

self.precmd 只是对用户的输入做了下预处理.

self.onecmd 负责执行命令.

self.postcmd 做执行命令后的一些操作.

self.postloop 循环结束时,执行的操作. 你可以在这里关闭日志、关闭数据库、say goodbye、...

于是我在自己的类中将 self.precmd 覆盖为:

def precmd(self, line):
        cmdlist = line.split('&&')
        line = cmdlist[0] if len(cmdlist) >0 else ''
        self.cmdqueue += cmdlist[1:]
        return line

OK. 

效果如下:

$echo 1st && sleep 1 && echo 2nd 1st 2nd

1st
2nd
$


cmd 模块真的很棒 :)

阅读(2859) | 评论(0) | 转发(0) |
0

上一篇:HP-UX 中殺後臺程序的腳本

下一篇:没有了

给主人留下些什么吧!~~