Pexpect库的简单学习

Pexpect库的简单学习

一、简单介绍及安装

  • expect主要用于模拟人机对话,简单地说就是可以使用正则匹配捕捉系统的提问(例如rm操作的确认,ssh登录需要输入密码等),并且根据捕捉到的提问进行不同的操作。
  • pexpect 是 Python 语言的类 Expect 实现。
  • 安装:pip install pexpect

二、基本使用流程

pexpect的执行流程其实就三步:
- 首先用spawn来执行一个程序
- 用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的,也就是计算机要问你的
- 当发现某个关键字之后,就进入到某些操作,操作结束后退出循环(或者操作进入下一个expect)

举个简单的例子,ftp的连接(代码来源)。

# -*- coding:utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals

import pexpect
import sys

# 用spawn来执行一个指令
child = pexpect.spawn('ftp ftp.openbsd.org')
# 用expect等待指定的关键字’name‘
child.expect('(?i)name .*: ')
# 若上一步匹配到了,则向计算机输入name
child.sendline('anonymous')
# 用expect等待指定的关键字’password‘
child.expect('(?i)password')
# 若上一步匹配到了,则向计算机输入password
child.sendline('pexpect@sourceforge.net')
# 用expect等待指定的关键字’ftp>‘
child.expect('ftp> ')
# 若上一步成功匹配,则意味着进入了ftp连接,现在做一些操作
child.sendline('cd /pub/OpenBSD/3.7/packages/i386')
child.expect('ftp> ')
child.sendline('bin')
child.expect('ftp> ')
child.sendline('prompt')
child.expect('ftp> ')
child.sendline('pwd')
child.expect('ftp> ')
print("Escape character is '^]'.\n")
sys.stdout.write (child.after)
sys.stdout.flush()
child.interact() # Escape character defaults to ^]
# At this point this script blocks until the user presses the escape character
# or until the child exits. The human user and the child should be talking
# to each other now.

# At this point the script is running again.
print('Left interactve mode.')

# The rest is not strictly necessary. This just demonstrates a few functions.
# This makes sure the child is dead; although it would be killed when Python exits.
if child.isalive():
    child.sendline('bye') # Try to ask ftp child to exit.
    child.close()
# Print the final state of the child. Normally isalive() should be FALSE.
if child.isalive():
    print('Child did not exit gracefully.')
else:
    print('Child exited gracefully.')

三、API

1、spawn()

spawn()执行一个程序,返回这个程序的操作句柄。

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

spawn()有两种调用方式

  • 传递一个参数,参数即将执行的命令字符串
process = pexpect.spawn('ftp sw-ftp')
  • 传递两个参数,第一个参数是主程序,第二个参数是主程序的参数
cmd = 'ftp sw-ftp'
process = pexpect.spawn('/bin/bash', ["-c", cmd])

推荐使用第二种调用方式,虽然代码看起来复杂了很多,但它可以避免一些事,例如命令行执行时出现特殊字符‘*’等。

举个例子:我想查找当前目录下ta开头的文件信息

  • 使用第一种方法
process = pexpect.spawn('ls ta*')

执行过后会爆出这个错误。

pexpect.exceptions.EOF: End Of File (EOF). Exception style platform.
  • 使用第二种方法
cmd = 'ls ta*'
process = pexpect.spawn('/bin/bash', ['-c', cmd])

结果正常执行。

spawn除了那两种传递指令的方法,还有一些关键字参数,例如:
- timeout 超时
- maxread 缓存设置
- searchwindowsize 模式匹配阈值
- logfile 日志文件
- env 指定环境变量
- cwd 指定执行目录
- 更多请参考spawn() - 执行程序

2、expect()

当拿到程序句柄后,可以调用句柄的expect()方法正则匹配寻找关键字,并根据关键字执行不同的操作。
写不下去了TAT

参考文档

Pexpect 模块使用说明
探索 Pexpect,第 1 部分:剖析 Pexpect
Pexpect version 4.6

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值