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 代表在等待目标正则表达式中出现了超时。

使用并捕获异常
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/

sudo yum install make sudo yum install kernel-devel sudo yum install elfutils-libelf-devel # 安装 Win pexpect 安装 https:// pexpect .readthedocs.io/en/stable/overview.html# pexpect -on- windows 这里使用的是pip安装 pip install win pexpect Win pexpect 实现ssh连接 核心代码如 child = win pexpect .win spawn (‘ssh -tt root@192... 第一步得在Pycharm的官网下载适用与自己版本的软件,下好后会给你提示说要注册码,网上找一个登录,里面的File有一个setting点进去,在project interpreter里,有一个小加号,里面搜索 pexpect ,然后下载就可以了。 我们再试一下import pexpect ,没有编译错误就说明成功。 目录前言1 从启动到主循环(main_loop)2 浅探cli_simple_loop3 查找与执行命令3.1 命令的描述3.2 命令的保存3.3 命令的查找3.4 命令的执行4 添加自己的命令要做哪些事参考文献 本文关注的是u-boot命令的实现机制,即从我们在超级终端敲下命令,到u-boot执行命令究竟发生了什么。本文基于的u-boot版本是u-boot-2019.10。 1 从启动到主循环(main_loop) 在u-boot-2019.10源码分析中,已经基本分析了从u-boot启动的第一条指 Pexpect 简介在讲解 Pexpect 之前,我们需要先了解一下Expect这个脚本语言,它是由TCL语言实现的,主要用于人机交互式对话的自动化控制,可以用来完成ssh、ftp、telnet等命令行程序的自动化交互。 Pexpect 其实就是一个用 Python 语言实现的类Expect功能的 模块 ,通过它就可以在 Python 中完成Expect所完成的功能。 Pexpect 的基本工作流程,基本可以分为以下三个步... 简介最近需要远程操作一个服务器并执行该服务器上的一个 python 脚本,查到可以使用 Pexpect 这个库。记录一下。什么是 Pexpect Pexpect 能够产生子应用程序,并控制他们,并能够通过期望模式对子应用的输出做出反应。 Pexpect 允许你的脚本产生子应用、控制他们像一个人类在输入命令一样。 Pexpect 使用在自动交互的应用,例如SSH、SFTP、PASSWD、TELNET。它可以被应用在使用... Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块 Pexpect 可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。 pexpect 模块 windows 功能有限,在linux系统中用得比较多。 pexpect 有两个类或方法用得比较多,一个是 pexpect .run() 和 pexpect . spawn () pexpect .run()类似于os.s... Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块 ,它可以用来和像ssh,ftp,passwd,telnet等命令行程序进行自动交互。 下载安装: http://sourceforge.net/projects/ pexpect / 概念理解: Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。