官网地址:https://pexpect.readthedocs.io/en/stable/api/pexpect.html
首先expect能用的,pexpect都可以用。
chile = pexpect.spawn()
1、需要注意的点,expect是流处理
chile.expect("\r\n") 可以匹配到结尾,不支持$,单独的\n, \r都是不能准确匹配的。
2、expect是非贪婪匹配
\d+的匹配配,想写贪婪,官方的说法是可以使用\d+\D
3、pexpect.spawn()中不支持> | *的,
如果想支持,可以用bash启动,/bin/bash -c "commend"
child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"')
4、pexpect日志输入到文件,或者可以输出到屏幕
child = pexpect.spawn('some_command')
fout = open('mylog.txt','wb')
child.logfile = fout #替换句柄
child.logfile = sys.stdout #
5、期望输入完成输入内容
p = pexpect.spawn('/bin/ls')
p.expect(pexpect.EOF)
print p.before
6、expect输入是list时会返回匹配到的index
index = p.expect(['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
7、expect默认编译正则,如果我想纯字符匹配,可以尝试expect_exact()
8、expect每次都有编译,如果我需要重复很多次,则速度会非常慢,这时可以考虑expect_list()
每次都调用已编译的正则,编译的方法可以使用compile_pattern_list()。
eg:
cpl = self.compile_pattern_list(my_pattern)
while some_condition:
...
i = self.expect_list(cpl, timeout)
...
9、send()传递的字符默认最大为256,如果需要传递更多,在启用是bash启用
bash = pexpect.spawn('/bin/bash', echo=False)
10、send,write,sendline,writelines,
send需要加\n才被执行,sendline则不用,write同sendline,只是没有返回值。writelines可以输入可迭代的元素
11、expect作为交互程序,必然有很多ctrol,这时可以使用sendcontrol()
child.sendcontrol('g') #相当于按下ctrl + G
同理sendintr() #发送中断信号 and sendeof() #发送eof,需要用户做的是记得加eof开头
12、读取获得的内容read(size),readline()
需要注意的是,readline会以\r\n做结束行
网友评论