探索 Pexpect,第 1 部分:剖析 Pexpect
2009-08-29 00:00:00 来源:WEB开发网Pexpect 则没有这样的问题,可以使用多线程并在线程中启动程序运行。但是在某些操作系统如 fedora9 中不可以在线程之间传递 Pexpect 对象。
清单 使用 Pexpect 在线程中启动控制子程序
请参见实例
对正则表达式的支持
在使用 expect() 时,由于 Pexpect 是不断从缓冲区中匹配,如果想匹配行尾不能使用 “$” ,只能使用 “\r\n”代表一行的结束。 另外其只能得到最小匹配的结果,而不是进行贪婪匹配,例如 child.expect ('.+') 只能匹配到一个字符。
应用实例:
在实际系统管理员的任务中,有时需要同时管理多台机器,这个示例程序被用来自动编译并安装新的内核版本,并重启。它使用多线程,每个线程都建立一个到远程机器的 telnet 连接并执行相关命令。 该示例会使用上文中的登录函数。
清单 23. 管理多台机器示例
import sys,os
from Login import *
PROMPT = “#UNIQUEPROMPT#”
class RefreshKernelThreadClass(threading.Thread):
""" The thread to downLoad the kernel and install it on a new server """
def __init__(self,server_name,user,passwd):
threading.Thread.__init__(self)
self.server_name_ = server_name
self.user_ = user
self.passwd_ = passwd
self.result_ = [] # the result information of the thread
def run(self):
self.setName(self.server_name_) # set the name of thread
try:
#call the telnet_login to access the server through telnet
child = telnet_login(self.server_name_,self.user_, self.passwd_)
except RuntimeError,ex:
info = "telnet to machine %s failed with reason %s" % (self.server_name_, ex)
self.result_.=(False, self.server_name_+info)
return self.result_
child.sendline(' cd ~/Download/dw_test && \
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.gz && \
tar zxvf linux-2.6.28.tar.gz && \
cd linux-2.6.28 \
&& make mrproper && make allyesconfig and make -j 4 && make modules && \
make modules install && make install')
# wail these commands finish
while True:
index = child.expect([PROMPT,pexpect.TIMEOUT,pexpect.EOF])
if index == 0:
break
elif index == 1:
pass
elif index ==2 :
self.result_=(False,'Sub process exit abnormally ')
return False
# reboot the server
child.sendline('shutdown -Fr')
child.expect('\r\n')
retry_times = 10
while retry_times > 0:
index_shutdown = child.expect(["Unmounting the file systems",
pexpect.EOF,
pexpect.TIMEOUT])
if index_shutdown == 0 or index_shutdown == 1 :
break
elif index_shutdown == 2:
retry_times = retry_times-1
if retry_times == 0:
self.result_=(False,'Cannot shutdown ')
return self.result_
def refresh_kernel(linux_server_list,same_user,same_passwd):
"""
@summary: The function is used to work on different linux servers to download
the same version linux kernel, conpile them and reboot all these servers
To keep it simple we use the same user id and password on these servers
"""
if not type(linux_server_list) == list:
return (False,"Param %s Error!"%linux_server_list)
if same_user is None or same_passwd is None or not
type(same_user)== str or not type(same_passwd) == str:
return (False,"Param Error!")
thread_list = []
# start threads to execute command on the remote servers
for i in range (len(linux_server_list)):
thread_list[i] = RefreshKernelThreadClass(linux_server_list[i],
same_user,same_passwd)
thread_list[i].start()
# wait the threads finish
for i in range (len(linux_server_list)):
thread_list[i].join()
# validate the result
for i in range (len(linux_server_list)):
if thread_list[0].result_[0] == False:
return False
else:
return True
if __name__ == "__main__":
refresh_kernel(server_list,"test_user","test_passwd")
- ››探索 ConcurrentHashMap 高并发性的实现机制
- ››探索Asp.net mvc 的文件上传(由浅入深)
- ››探索博客发展之路:给博客一个明确的定位
- ››部分 WM6.5 手机有望升级到 Windows Phone 7
- ››探索 Eclipse JDT 中的重构功能
- ››探索 Eclipse 的 Ajax Toolkit Framework
- ››探索 Eclipse V3.1 的新特性:更高的可用性、更广...
- ››探索 Flex 和 CSS 的强大功能
- ››探索 Pexpect,第 1 部分:剖析 Pexpect
- ››探索 Pexpect,第 2 部分:Pexpect 的实例分析
- ››部分英特尔芯片不支持Windows 7“XP模式”
- ››探索 AIX 6:在 AIX 6 上配置 iSCSI Target
更多精彩
赞助商链接