WEB开发网
开发学院软件开发Python 探索 Pexpect,第 1 部分:剖析 Pexpect 阅读

探索 Pexpect,第 1 部分:剖析 Pexpect

 2009-08-29 00:00:00 来源:WEB开发网   
核心提示: Pexpect 则没有这样的问题,可以使用多线程并在线程中启动程序运行,探索 Pexpect,第 1 部分:剖析 Pexpect(9),但是在某些操作系统如 fedora9 中不可以在线程之间传递 Pexpect 对象,清单 使用 Pexpect 在线程中启动控制子程序 请参见实例 对正则表达式

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

上一页  4 5 6 7 8 9 

Tags:探索 Pexpect 部分

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接