python常用模块-Pexpect


Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现

pexpect 是 Python 语言的类 Expect 实现。从我的角度来看,它在功能上与 TCL 语言的实现还是有一些差距,比如没有buffer_full 事件、比如没有 expect before/after 事件等,但用来做一般的应用还是足够了

基本使用流程

  • 首先用 spawn 来执行一个程序
  • 然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的
  • 最后当发现这个关键字以后,根据关键字用 send 方法来发送字符串给这个程序

基本方法

spawn

process = pexpect.spawn('ftp sw-tftp')

上面 spawn() 中的字符串就是要执行的程序,这里我们打开一个到 sw-tftp 服务器的 ftp 连接。 spawn() 中的第一个元素就是要执行的命令,除此之外还可以指定一些其他参数

  • timeout:超时时间,默认时长为30s
  • maxread:缓存设置,指定一次性试着从命令输出中读多少数据。如果设置的数字比较大,那么从 TTY 中读取数据的次数就会少一些
  • logfile:当给 logfile 参数指定了一个文件句柄时,所有从标准输入和标准输出获得的内容都会写入这个文件中(注意这个写入是 copy 方式的),如果指定了文件句柄,那么每次向程序发送指令(process.send)都会刷新这个文件(flush)
process = pexpect.spawn("ftp sw-tftp", logfile=sys.stdout)

expect

当 spawn() 启动了一个程序并返回程序控制句柄后,就可以用 expect() 方法来等待指定的关键字了。它最后会返回 0 表示匹配到了所需的关键字,如果后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到了列表中第几个关键字,从 0 开始计算

process.expect(pattern_list, timeout=-1)
index = process.expect([
    'Permission Denied',
    'Terminal type',
    'ftp>',
])
if index == 0:
    print "Permission denied at host, can't login."
    process.kill(0)
elif index == 1:
    print "Login ok, set up terminal type…"
    process.sendline('vty100')
    process.expect("ftp>")
elif index == 2:
    print "Login Ok, please send your command"
    process.interact()

如果要检查或者匹配 expect.EOF 和 expect.TIMEOUT 这两种情形,那么必须将它们放进匹配列表里面去,这样可以通过检查返回的数字来处理它们。如果没放进列表的话,就会发生 EOF 或者 TIMEOUT 错误,程序就会中途停止了

child.expect(['(?i)etc', '(?i)readme', pexpect.EOF, pexpect.TIMEOUT])

send

send() 作为3个关键操作之一,用来向程序发送指定的字符串,它的使用没什么特殊的地方

process.expect("ftp>")

sendline

sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方

sendcontrol

sendcontrol() 向子程序发送控制字符

特殊变量

pexpect.EOF

EOF 变量使用范围很广泛,比如检查 ssh/ftp/telnet 连接是否终止啊,文件是否已经到达末尾啊。 pexpect 大部分脚本的最后都会检查 EOF 变量来判断是不是正常终止和退出,比如下面的代码

pexpect.TIMEOUT

TIMEOUT 变量用来匹配超时的情况,默认情况下 expect 的超时时间是 60 秒,如果超过 60 秒还没有发现期待的关键字

其余更多的用法可以参考下面这边文章,非常详细
https://www.jianshu.com/p/cfd163200d12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值