html tool

2016年9月6日星期二

pexpect.expect中正则使用

问题:

在sh运行使用对异常的处理如何监控

解决方式:
class sh_test():                        
    def __init__(self):                 
        cmd = "python ter.py"           
        self.pe = pexpect.spawn(cmd)    
                                        
    def t_doing(self):                  
        s1 = "here_10"                  
        s2 = "hi_50"                    
        print "start expect"            
        x = self.pe.expect([s2,s1])    -----------------1 
        self.pe.kill(0)                 
        print "********************"    
        print "before %s" % str(self.pe.before)
        print "after %s" % str(self.pe.after)
        if s1 == self.pe.after :        
            print "s1[%s] is first" % s1

其中1的参考:https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/

expect() 中正则表达式的使用 tips

expect() 中的正则表达式不是贪婪匹配 greedy match,而是最小匹配,即只匹配缓冲区中最早出现的第一个字符串。 因为是依次读取一个字符的 stream 流来判断是否和正则表达式所表达的模式匹配,所以如果参数 pattern 是个 list,而且不止一次匹配,那么缓冲区中最早出现的第一个匹配的字符串才算数。
清单 14. expect() 的最小匹配例子代码
# 如果输入是 'foobar'
index = p.expect (['bar', 'foo', 'foobar'])
#index 返回是 1 ('foo') 而不是 2 ('foobar'),即使 'foobar' 是个更好的匹配。原因是输入是个流 stream,
# 当收到 foo 时,第 1 个 pattern ('foo') 就被匹配了,不会等到’ bar ’的出现了,所以返回 1
  • “$”不起任何作用,匹配一行的结束 (end of line),必须得匹配 CR/LF
正则表达式中,'$'可以匹配一行的结束(具体'$'正则表达式的使用,请参阅参考资料),但是 pexpect 从子程序中一次只读取一个字符,而且每个字符都好像是一行的结束一样,pexpect 不能在子程序的输出流去预测。匹配一行结束的方法必须是匹配 "\r\n" (CR/LF) 。即使是 Unix 系统,也是匹配 "\r\n" (CR/LF),因为 pexpect 使用一个 Pseudo-TTY 设备与子程序通话,所以当子程序输出 "\n" 你仍然会在 python 主程序中看到 "\r\n" 。原因是 TTY 设备更像 windows 操作系统,每一行结束都有个 "\r\n" (CR/LF) 的组合,当你从 TTY 设备去解释一个 Unix 的命令时,你会发现真正的输出是 "\r\n" (CR/LF),一个 Unix 命令只会写入一个 linefeed (\n),但是 TTY 设备驱动会将其转换成 "\r\n" (CR/LF) 。
清单 15. 匹配一行结束 1
child.expect ('\r\n')

没有评论:

发表评论