首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

探索 Pexpect,第 一 部分:剖析 Pexpect

2012-12-28 
探索 Pexpect,第 1 部分:剖析 PexpectFrom:?http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/i

探索 Pexpect,第 1 部分:剖析 Pexpect

From:?http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/index.html

?

探索 Pexpect,第 1 部分:剖析 Pexpect

?

吕 学良?(lvxuel@cn.ibm.com), 软件工程师, IBM丁 钦浩?(dingqinh@cn.ibm.com), 软件开发工程师, IBM王 乾?(wqwqain@cn.ibm.com), 软件工程师, IBM

?

简介:?Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块。 Pexpect 可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。本文章介绍 Pexpect 的主要用法和在实际应用中的注意点。 Python 语言的爱好者,系统管理人员,部署及测试人员都能使用 Pexpect 在自己的工作中实现与命令行交互的自动化。

?

标记本文!

?

发布日期:?2009 年 5 月 07 日?
级别:?初级?
访问情况?2179 次浏览?
建议:?1?(查看或添加评论)

探索 Pexpect,第 一 部分:剖析 Pexpect探索 Pexpect,第 一 部分:剖析 Pexpect探索 Pexpect,第 一 部分:剖析 Pexpect探索 Pexpect,第 一 部分:剖析 Pexpect探索 Pexpect,第 一 部分:剖析 Pexpect?平均分 (共 6 个评分 )

?

概述

Pexpect 是 Don Libes 的?Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

下载

Pexpect 可以从?SourceForge?网站下载。 本文介绍的示例使用的是 2.3 版本,如不说明测试环境,默认运行操作系统为 fedora 9 并使用 Python 2.5 。

安装

依赖

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

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

    遵循 MIT 许可证

    根据 Wiki 对 MIT License 的介绍“该模块被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软件及软件的副本。被授权人可根据程序的需要修改授权条款为适当的内容。?在软件和软件的所有副本中都必须包含版权声明和许可声明。”

    回页首

    Pexpect 提供的 run() 函数:


    清单 1. run() 的定义
    回页首

    Pexpect 提供的 spawn() 类:

    使用 Pexpect 启动子程序


    清单 4. spawn 的构造函数
    使用 Pexpect 控制子程序

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


    清单 10. expect() 定义

    回页首

    Pxssh 类的使用:

    Pxssh 做为 pexpect 的派生类可以用来建立一个 ssh 连接,它相比其基类增加了如下方法:

    login() 建立到目标机器的ssh连接 ;

    losuckgout() 释放该连接 ;

    prompt() 等待提示符,通常用于等待命令执行结束。

    下面的示例连接到一个远程服务器,执行命令并打印命令执行结果。

    该程序首先接受用户输入用户名和密码,login 函数返回一个 pxssh 对象的链接,然后调用 sendline() 分别输入 “uptime”、“ls” 等命令并打印命令输出结果。


    清单 20. pxssh 示例

    回页首

    Pexpect 使用中需要注意的问题:

    spawn() 参数的限制

    在使用spawn执行命令时应该注意,Pexpect 并不与 shell 的元字符例如重定向符号 > 、>> 、管道 | ,还有通配符 * 等做交互,所以当想运行一个带有管道的命令时必须另外启动一个 shell ,为了使代码清晰,以下示例使用了参数列表例如:


    清单 21. 启动新的 shell 执行命令
    与线程共同工作

    Perl 也有 expect 的模块?Expect-1.21,但是 perl 的该模块在某些操作系统例如 fedora 9 或者 AIX 5 中不支持在线程中启动程序执行以下实例试图利用多线同时程登录到两台机器进行操作,不使用线程直接调用时 sub1() 函数可以正常工作,但是使用线程时在 fedora9 和 AIX 5 中都不能正常运行。


    清单 22. perl 使用 expect 由于线程和 expect 共同使用导致不能正常工作的程序

    Pexpect 则没有这样的问题,可以使用多线程并在线程中启动程序运行。但是在某些操作系统如 fedora9 中不可以在线程之间传递 Pexpect 对象。

    清单 使用 Pexpect 在线程中启动控制子程序

    请参见实例

    对正则表达式的支持

    在使用 expect() 时,由于 Pexpect 是不断从缓冲区中匹配,如果想匹配行尾不能使用 “$” ,只能使用 “\r\n”代表一行的结束。 另外其只能得到最小匹配的结果,而不是进行贪婪匹配,例如 child.expect ('.+') 只能匹配到一个字符。

    回页首

    应用实例:

    在实际系统管理员的任务中,有时需要同时管理多台机器,这个示例程序被用来自动编译并安装新的内核版本,并重启。它使用多线程,每个线程都建立一个到远程机器的 telnet 连接并执行相关命令。 该示例会使用上文中的登录函数。


    清单 23. 管理多台机器示例


    参考资料

    • 访问?Expect?的主页,了解更多 Expect 的内容。

    • 参考?Wiki?上关于 MIT 许可证的介绍。

    • 查看文章“ Expect 在网络管理中发挥着重要作用”介绍 Expect 在网络管理中的应用。

    • Perl 语言中的 Expect?了解 Perl 语言中的 Expect 。

    • 在?developerWorks Linux 专区寻找为 Linux 开发人员(包括?Linux 新手入门)准备的更多参考资料,查阅我们最受欢迎的文章和教程。

    • 在 developerWorks 上查阅所有?Linux 技巧和?Linux 教程。

      作者简介

      吕学良,IBM 中国开发中心,软件工程师,2007 年获得浙江大学计算机硕士学位并于同年加入 IBM 中国开发中心工作,目前主要工作是从事 Storage系统的研发。

      丁钦浩,IBM 中国开发中心,软件工程师,2007 年获得东南大学电子系硕士学位并于同年进入 IBM 中国开发中心工作,目前主要工作是从事 Storage 上 DSCLI(Disk Storage Command Line Interface)的 Java 开发。

      王乾,IBM 中国开发中心,软件工程师,2009 年毕业于南京大学并于同年加入 IBM 中国开发中心工作,目前主要工作是从事 Storage 系统的研发。

热点排行