概述

Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块,它可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。

下载

Pexpect 可以从 SourceForge 网站下载。下载地址:http://sourceforge.net/projects/pexpect/

依赖

Python 版本 2.4 或者 2.5
    pty module ,pty 是任何 Posix 系统标准库的一部分

由于其依赖 pty module ,所以 Pexpect 还不能在 Windows 的标准 python 环境中执行,如果想在 Windows 平台使用,可以使用在 Windows 中运行 Cygwin 做为替代方案。

run() 函数

函数 run 可以用来运行命令,其作用与 Python os 模块中 system() 函数相似。run() 是通过 Pexpect 类实现的。如果命令的路径没有完全给出,则 run 会使用 which 命令尝试搜索命令的路径 。
使用方法

import os,sys
from pexpect import *
print 'run("ls") have not log!'
run("ls")
print 'logfile = run("ls") : log is in logfile!'
log = run("ls")
print log,
print 'run("ls",logfile=sys.stdout): log standard output'
run("ls",logfile=sys.stdout)(command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1)  #capture exit status
run ('scp foo myname@host.example.com:.', events={'(?i)password': mypassword}) #很实用

spawn() 类

使用 Pexpect 启动子程序

child = pexpect.spawn ('/usr/bin/ftp') #执行ftp客户端命令
child = pexpect.spawn ('/usr/bin/ftp', []) #使用一个参数的列表
fout = file('mylog.txt','w')
child.logfile = fout  #指定了 Pexpect 产生的日志的记录位置
child.logfile = sys.stdout #log标准输出
child.logfile_send = sys.stdout #不记录向子程序输入的日志,只记录子程序的输出

注意:Pexpect不支持管道,重定向或者通配符wild cards(如*)。如果需要使用,需重新打开一个shell

child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > log_list.txt"')

使用 Pexpect 控制子程序

为了控制子程序,等待子程序产生特定输出,做出特定的响应,可以使用 expect 方法。

expect() 在执行中可能会抛出两种类型的异常分别是 EOF and TIMEOUF,其中 EOF 通常代表子程序的退出, TIMEOUT 代表在等待目标正则表达式中出现了超时。

使用并捕获异常
try:index = pexpect (['good', 'bad'])if index == 0:do_something()elif index == 1:do_something_else()except EOF:do_some_other_thing()
except TIMEOUT:do_something_completely_different()
before 和after

expect 不断从读入缓冲区中匹配目标正则表达式,当匹配结束时 pexpect 的 before 成员中保存了缓冲区中匹配成功处之前的内容, pexpect 的 after 成员保存的是缓冲区中与目标正则表达式相匹配的内容。

child = pexpect.spawn('/bin/ls /')
child.expect (pexpect.EOF)
print child.before

此时 child.before 保存的就是在根目录下执行 ls 命令的结果。

send 系列函数
send(self, s)
sendline(self, s='')
sendcontrol(self, char)

这些方法用来向子程序发送命令,模拟输入命令的行为。 与 send() 不同的是 sendline() 会额外输入一个回车符 ,更加适合用来模拟对子程序进行输入命令的操作。 当需要模拟发送 “Ctrl+c” 的行为时,还可以使用 sendcontrol() 发送控制字符。

sendcontrol
child.sendcontrol('c') #执行 ctrl+c

由于 send() 系列函数向子程序发送的命令会在终端显示,所以也会在子程序的输入缓冲区中出现,因此不建议使用 expect 匹配最近一次 sendline() 中包含的字符。否则可能会在造成不希望的匹配结果。

参考资料:http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/

Python模块之---Pexpect相关推荐

  1. Python模块之pexpect详解

    Python模块之pexpect详解(一) 一.pexpect模块介绍 二.Pexpect的安装 三.pexpect的核心组件 3.1 spawn类 3.1.1 简介 3.1.2 使用流程 3.1.3 ...

  2. Python模块学习

    阅读目录 第一篇:Python模块之netmiko 第二篇:Python模块之junos-eznc 第三篇:Python模块之pexpect 第四篇:Python模块之paramiko 第五篇:Pyt ...

  3. 如何获取本地安装的Python模块列表?

    我想获得Python模块的列表,这些模块在我的Python安装(UNIX服务器)中. 如何获得计算机中安装的Python模块的列表? #1楼 使用pkgutil.iter_modules非常简单的搜索 ...

  4. 常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherrypy:一个WEB framework c ...

  5. Python模块字典

    一[文本时间处理] Chardet # 字符编码探测器 # 可以自动检测文本.网页.xml的编码 | colorama # 主要用来给文本添加各种颜色 # 并且非常简单易用 | Prettytable ...

  6. 常用python模块及安装

    adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherrypy:一个WEB framework c ...

  7. [Python]如何快速知道要使用哪些python模块和有哪些功能

    1,查看python自带的lib, 例如:http://docs.python.org/3.1/library/ 2,如果想看自己的python项目都导入了那些模块,可以用sys.modules输出来 ...

  8. python pexpect_探索 Pexpect,第 2 部分:Pexpect 的实例分析

    探索 Pexpect,第 2 部分:Pexpect 的实例分析 丁 钦浩, 王 栋柯, 和 王 乾 2009 年 8 月 26 日发布 概述 通过本系列第一部分<探索 Pexpect,第 1 部 ...

  9. Python模块(自己整理并不完整)

    PY核心模块方法 ******************** os模块: os.remove() 删除文件  os.unlink() 删除文件  os.rename() 重命名文件  os.listdi ...

最新文章

  1. rs232串口驱动_LED驱动电路设计
  2. GXGetImage方式连续采集和发送软触发采集
  3. Unity3D Mecanim 动画系统骨骼动画问题解决方法
  4. ubuntu: no module named _sqlite
  5. win10只有edge浏览器能上网的解决方法
  6. JavaScript算法(实例四)分解质因数 / 四舍五入 / 阶乘之和
  7. 洛谷T1967 货车运输 Kruskal最大生成树倍增LCA
  8. ZigBee TI ZStack CC2530 8.4 如何用高版本IAR打开低版本协议栈
  9. win11如何登陆本地用户 windows11登陆本地用户的步骤方法
  10. QT5.3.2与VS2013 fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突_(解决方案)...
  11. linux系统,清理缓冲池内存
  12. Java版取色器(2)——安装IntelliJ IDEA
  13. 时间序列入门概念整理
  14. 【U8】UFO另存为Excel,文件保存失败
  15. 面试被问到HashMap 底层原理?看完这边文章绝对不慌!
  16. Mybatis入门学习
  17. IDEA 安装字体 安装JetBrains Mono字体
  18. 纯css实现动态渐变背景,一分钟学会
  19. 承包一座山能做什么_您为什么没有得到最好的承包商,又能做些什么(第2部分)...
  20. app开发都有哪些基本的开发语言选择?

热门文章

  1. codecs.open 和一般的open 区别~
  2. HelloWorld之jetty运行
  3. htc e9pw android 6.0,HTC One E9+(E9pw 联通4G)一键ROOT教程,简单ROOT
  4. 前2个月我国外贸进出口5919.9亿美元,下降11%,贸易逆差70.9亿美元
  5. Nachos内存管理实现
  6. 基于机器学习算法对电动汽车能耗估计
  7. 关于“硬件工程师工资不高”的几个真相
  8. 详解 Web Worker,不再止步于会用
  9. Lanczos方法计算严格对角化格林函数
  10. 黑马Redis学习——实战篇(4)