Chinaunix
标题:
Python中的cmd模块2--cmdqueue
[打印本页]
作者:
libin1983
时间:
2010-01-11 16:58
标题:
Python中的cmd模块2--cmdqueue
最近应用 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 模块真的很棒 :)
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u/10686/showart_2145873.html
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2