spawn类expect方法详解
本文我们将介绍spawn类的基本方法expect方法,这个方法是用来匹配返回的结果,这个返回的结果是指子程序的返回结果,同时会将匹配的相关信息保存在spawn类的相关属性中。
基本属性包括三个,第一个是before,是匹配点之前的文本,这里的匹配是指用expect这个方法来匹配的结果,那么匹配点之前的文本会放到before,这个实例属性中,并且我们要注意多次匹配时,不包括上次已匹配之前的内容。第二个after,它是用来保存匹配成功的内容,也是同样的是expect这个方法在进行匹配时,匹配成功的内容会放在after当中。第三个基本属性match,是用来保存已匹配的匹配对象,如果匹配不成功的话,就是none。

特殊的匹配是指pexpect库当中一个的EOF,和TIMEOUT,这两个实际上是两个异常类,它们也可以用于在expect中进行匹配,另外我们再来看expect方法的使用方式,这个方法主要的参数包含pattern和timeout,从这个名称上可以看出来,timeout实际上就是超时的,pattern就是用于匹配的主要模式,对于这个可以是以下几种形式,可以为字符串,正则表达式,EOF,TIMEOUT,或者是以上类型的列表。用以匹配子命令返回的结果。从子命令返回结果中进行匹配,若只提供字符串等非列表,匹配成功返回0,若提供列表,则返回匹配成功的列表序号,匹配失败,则会引发异常。

下面我们来看expect匹配方法的使用事例,首先启动虚拟机,进入python3,然后导入这个模块,首先我们要建立一个spawn事例,这个时候我们运行的是pexpect这个命令,列出当前目录下的目录以及文件,建立了spawn事例以后,我们就可以调用expect的方法来进行匹配。

比如我们当前的目录下面有test这个文件,那么就可以尝试来匹配test。 直接调用这个类实例的expect方法。

传递给他一个参数喂test,也就是之前的pattern参数,给它的值为test,然后从“ls -l”这个命令中来匹配test这个信息,那么返回值为0,表示匹配成功,如果我们要查询要匹配的结果,就可以使用spawn类的before属性或者after属性来查看,首先用before属性,输命令后出来的都是匹配以前的内容。那么匹配到什么信息,我们可以用after来查看,我们还可以通过调用它的match属性来查看匹配的结果,也就是正则对象,这个正则对象显示了接到的信息是从289到293。匹配的内容就是test,对于子程序返回的信息,我们还可以进行多次匹配。

我们匹配到的test实际上在这个test后面ttt文件,我们也可以来匹配ttt,这个时候我们传入一个列表形式的参数。可以看到它返回的值为1,也就是说test已经匹配过了,它不会子程序返回信息的开头再次去匹配,而是从子程序匹配完之后的信息当中,进行匹配,所以它匹配到的是tt。

我们也可以用before属性来进行查看,那么这是匹配之前的内容,匹配之前的内容当然不包括之前已经被匹配的内容,我们还可以同样的看到它的after,可以看到tt被匹配到了,当执行的匹配没有匹配成功的时候,它会抛出异常,比如我们刚刚的test,已经匹配完成了,如果我要再次匹配test。

可以看到这个系统就输出了很多内容,就表示此时已经抛出了异常,也就是没有匹配到内容。
这里的expect方法对pattern进行匹配,有一些和我们平常常用的正则表达式的匹配方式是有所不同的,因为它的匹配方式是从返回的信息中逐个字符读出,然后进行匹配,当pattern为列表的时候,从左至右哪个最先匹配到就匹配哪个。

比如说我们仍然来做pexpect的匹配,然后我们来做这样一个匹配,输入代码,可以看到匹配的结果为1,也就是te被匹配到了,但是tt没有被匹配到,那么tt在我们刚刚列出的信息当中实际上是包含tt的,也包含了te,而且tt在te的后面,而在匹配的时候,因为它是被输出的信息从前到后进行匹配的,所以在列表当中的te被首先匹配到,因此它返回的1,而不是返回0。也就是说第二个先出现的字符串被匹配到,而第一个没有被匹配,这就是列表的匹配顺序。
对于列表的匹配,我们还可以这样使用,比如,当我们在匹配结果信息的时候,如果不存在这个结果信息,那么程序就会抛出异常,中断运行,因此,我们还可以在列表中添加一个EOF这个项目,来使得匹配的时候不会退出程序。

下面我们来看一个简单的例子,首先我们仍然先启动一个子程序, 由于这里面的命令只会输出当前命令下的所有文件和目录,如果我们要随意指定一个名称,可能它就会中断程序的执行,所以我们在匹配的时候,可以这样来做,输入命令后面加上EOF,这样我们就可以知道返回的结果,知道这个命令是否能够成功。由于这个abc是匹配不成功的,所以它匹配的就是第二个项目,所以返回的是1,因此这个程序并不会中断执行。如果我们要直接匹配abc,可以看到会匹配失败,程序会中断执行,这是列表的另外一种用法。
在expect方法中进行匹配的时候,会自动应用re.DOTALL正则选项里面的“.+”可以匹配所有字符,“.*”返回空字符。如果在expect方法中,要匹配行尾,我们需要使用“r/n”,这个字符串,如果在正则表达式中使用“$”符号来匹配行尾,下面我们具体来看实例。
首先我们要先看换行符的实例。

我们运行的命令仍然是ls-l命令,匹配一个换行,用“/r/n”来表示,然后返回0表示匹配成功,我们可以查看匹配的结果,这就是匹配之前的内容,这个就是匹配到的换行符,我们还可以查看匹配的整个字符串,这是匹配行的方法,如果我们使用“.*”来进行匹配的话,对于返回信息的第一次匹配,“.*”号会返回一个控制符。

输入代码进行匹配,匹配完成之后我们在进行“.*”的匹配,然后查看一下匹配的结果,可以看到它将剩下的所有的字符的结果全部匹配进去了,这就是“.*”用来匹配的特殊的情况,也就是在开始匹配和后天的匹配,结果是不同的。

我们可以看到spawn这个类,它启动的子程序返回信息after类型,所以我们如果要匹配这里面的返回信息中的中文字符串,我们就需要把中文字符串进行编码,比如在这个桌面当中,有“公共”这个字符串,我们来匹配它,来查看一下。

首先我们仍然先建立实例,进行ls这个命令,然后我们来匹配一下它的中文,掉用“encode”这个方法,用utf8来进行编码,然后查看匹配的结果,那么它就是一个字符串的形式,如果我们要看它真正的值,然后我们可以先将它进行解码,可以看到它就是“公共”这两个字,也就是说我们在这个地方进行中文匹配的时候,要对中文进行编码。
来源:麦子学院
原文链接:http://www.maiziedu.com/wiki/library/expect/
spawn类expect方法详解的更多相关文章
- spawn类参数command详解
我们主要来看spawn类它的构造方法参数主要有command,从字面上就是指spawn类的子程序用来执行的子程序,也就是系统所能够执行的相应的命令,对于command这个参数,我们是以字符串的方式给出 ...
- Android之TelephonyManager类的方法详解
TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...
- Object类中方法详解
目录 概述 hashCode方法 getClass方法 toString方法 equals方法 clone方法 finalize方法 概述 Object 是类层次结构的根类.每个类都使用 Object ...
- TelephonyManager&GsmCellLocation类的方法详解
转载:http://blog.163.com/zhangzheming_282/blog/static/117920962011101944356511/ TelephonyManager类 主要提供 ...
- Java中File类的方法详解
File类也是Java中一个比较重要的类,通过他我们可以实现对文件的一系列操作,其内置了很多方法,下面我将按方法的功能分块,逐一讲解: 快速导航 构造方法 常用方法 创建目录 判断 `is...` t ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- Python的Django框架中forms表单类的使用方法详解
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...
- ES6 类(Class)基本用法和静态属性+方法详解
原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...
- StringUtils类API及使用方法详解
StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...
随机推荐
- python读取Excel实例
1.操作步骤: (1)安装python官方Excel库-->xlrd (2)获取Excel文件位置并读取 (3)读取sheet (4)读取指定rows和cols内容 2.示例代码 # -*- c ...
- HOJ - 2715最小费用流
国庆八天乐,刷题也快乐. HOJ崩了,但是VJ可以把题目挂出来. 题目链接:https://vjudge.net/contest/188441#problem/A 涉及到矩阵里面的网络流,化为图来做. ...
- Xamarin.Forms的ActivityIndicator和ProgressBar比较
Xamarin.Forms的ActivityIndicator和ProgressBar比较 在Xamarin.Forms中,控件ActivityIndicator和ProgressBar都用来表示 ...
- k8s之Service资源
1.Service概述 service是kubernetes中最核心的资源对象之一,service和pod之间是通过Label串起来,相同的Service的pod的Label是一样的.同一个servi ...
- mc
Description 小C在MC里有n个牧场,自西向东呈一字形排列(自西向东用1-n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站, 每个牧场上只能建立一个控制站,每个控 ...
- openssl转换各种证书的语法收集
参考网址:https://www.sslshopper.com/ssl-converter.html 个人总结:先找准要生成什么证书先,尤其是正规购买的流程与openssl生成的不一样,所以先确定是什 ...
- Oracle 11g客户端
资源 下载资源,直接解压进行配置 Oracle官方资源:http://www.oracle.com/technetwork/database/features/instant-client/index ...
- Jmeter Summariser report及其可视化
Jmeter summariser report的设置在:bin/jmeter.properties #------------------------------------------------ ...
- C语言-回溯例2
组合问题 组合:从n个不同元素中取r个不重复的元素组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组合,例如OR = {1,2,3,4}, n = 4, r = 3则无重组合为: {1,2 ...
- mysql truncate table命令使用总结
truncate使用注意 由于上过truncate table a_table命令一次当,将教训记录下来,以示警戒! mysql truncate table a_table命令受影响结果说明 ...