Python模块pexpect安装及使用流程

目录
  • 一、pexpect模块介绍
  • 二、Pexpect的安装
  • 三、pexpect的核心组件
    • 3.1spawn类
      • 3.1.1简介
      • 3.1.2使用流程
      • 3.1.4基本属性和方法
      • 3.1.5其他发送信息的方法
      • 3.1.6其他获取结果的方法
      • 3.1.7其他常用方法
      • 3.1.8控制子程序方法

一、pexpect模块介绍

Pexpect使Python成为控制其他应用程序的更好工具。可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的

二、Pexpect的安装

#python2
pip install pexpect
#python3
pip3 install pexpect

三、pexpect的核心组件

3.1 spawn类

3.1.1 简介

  • 是Pexpect库的主要对象即接口类
  • 用于启动和控制子程序

3.1.2 使用流程

  • 建立spawn类的实例,传入要运行的命令。
  • 调用spawn类的实例方法,与子命令交互。
  • 通过交互的信息,完成要实现的相关功能。

3.1.3 构造方法参数

参数 说明
command 任何系统可执行的命令
参数可直接放入command
不直接支持管道、通配符、标志输入、输出、错误重定向
args=[] 专门将command命令的参数放入这个列表中
'/bin/bash',['-c','cat test | grep gree']形式
实现管道、通配符、标志输入、输出、错误重定向等功能
timeout=30 超出时间,抛出错误
maxread=2000 从TTY读取信息最大缓冲区
logfile=None 指定日志文件,可指定为sys.stdout
cwd=None 指定命令运行时的当前目录
env=None 指定命令运行时环境变量有哪些
encoding=None 命令运行时,信息编码
codec_errors=‘strict’ 编码转换时的转向

(1)command

>>> import pexpect
>>> child = pexpect.spawn('ls')
>>> child.expect(pexpect.EOF)
0
>>> print(child.before.decode())
get-pip.py  nohup.out  stop-ssl-dos.sh
index.html  Python-2.7.18  ssl_flood.sh

>>> child = pexpect.spawn('ls -l /home')
>>> child.expect(pexpect.EOF)
0
>>> print(child.before.decode())
total 12
drwxr-xr-x 12 root root 4096 Dec 15 14:52 files
drwxr-xr-x 10 root root 4096 Aug 13  2020 opt
drwxr-xr-x  2 root root 4096 Jul 27  2017 users

# 不支持管道、通配符、标志输入、输出、错误重定向
>>> child = pexpect.spawn('ls -l | grep Python')
>>> child.expect(pexpect.EOF)
0
>>> print(child.before.decode())
/bin/ls: cannot access |: No such file or directory
/bin/ls: cannot access grep: No such file or directory
/bin/ls: cannot access Python: No such file or directory

(2)args=[]

# []传入参数列表
>>> child = pexpect.spawn('ls',args=['-l','/home'])
>>> child.expect(pexpect.EOF)
0
>>> print(child.before.decode())
total 12
drwxr-xr-x 12 root root 4096 Dec 15 14:52 files
drwxr-xr-x 10 root root 4096 Aug 13  2020 opt
drwxr-xr-x  2 root root 4096 Jul 27  2017 users

# 实现管道、通配符、标志输入、输出、错误重定向等功能
>>> child = pexpect.spawn('/bin/bash',['-c','ls -al | grep Python'])
>>> child.expect(pexpect.EOF)
0
>>> print(child.before.decode())
drwxr-xr-x  18 1000 1000       4096 Feb  9 20:31 Python-2.7.18

(5)logfile=None

打开文件

>>> f = open('log.txt','wb')
>>> child = pexpect.spawn('ls -l /home', logfile=f)
>>> child.expect(pexpect.EOF)
0
>>> f.close()
>>> exit()

[root@xxxx-2021 ~]# cat log.txt
total 12
drwxr-xr-x 12 root root 4096 Dec 15 14:52 files
drwxr-xr-x 10 root root 4096 Aug 13  2020 opt
drwxr-xr-x  2 root root 4096 Jul 27  2017 users

在终端直接显示

>>> f = open('log.txt','wb')
>>> child = pexpect.spawn('ls -l /home', logfile=f)
>>> child.expect(pexpect.EOF)
0
>>> f.close()
>>> exit()

[root@xxxx-2021 ~]# cat log.txt
total 12
drwxr-xr-x 12 root root 4096 Dec 15 14:52 files
drwxr-xr-x 10 root root 4096 Aug 13  2020 opt
drwxr-xr-x  2 root root 4096 Jul 27  2017 users

(6)cwd=None

>>> child = pexpect.spawnu('ls -al', logfile=sys.stdout, cwd='/home')
>>> child.expect(pexpect.EOF)
total 20
drwxr-xr-x  5 root root 4096 Jul 27  2017 .
drwxr-xr-x 28 root root 4096 Dec 16 07:56 ..
drwxr-xr-x 12 root root 4096 Dec 15 14:52 files
drwxr-xr-x 10 root root 4096 Aug 13  2020 opt
drwxr-xr-x  2 root root 4096 Jul 27  2017 users
0
>>>

3.1.4 基本属性和方法

描述 说明
基本方法 expect(pattern,timeout=-1)注:仅列出主要参数
- pattern:可以为字符串、正则表达式、EOF、TIMEOUT,或者是以上类型的列表。用于匹配子命令返回结果
- 从子命令返回结果中进行匹配,若只提供字符串等非列表,匹配成功返回0;若提供列表,则返回匹配成功的列表序号;匹配失败则会引发异常;
- 匹配事项:
(1)匹配的方式是从返回信息中逐个字符读出进行匹配
(2)pattern为列表时,从左至右哪个最先匹配到就匹配哪个
(3)可以对结果进行多次匹配,但只能从前往后,前边已搜索匹配的内容不会再进行匹配
(4)匹配时自动应用re.DOTALL正则选项。(.+会匹配所有字符,.*返回空字符)。
(5)匹配行尾用'\r\n'(无法用$匹配行尾)
- timeout默认为-1时,使用默认的超时期限;设置为None时,将阻塞至返回信息

sendline(s='')

基本属性 before:匹配点之前的文本
after:匹配成功的内容
match:已匹配的匹配对象,匹配失败为None
特殊匹配 pexpect.EOF
pexpect.TIMEOUT
它们实际是两个异常类

(1)expect()连续匹配

# 连续匹配
>>> child = pexpect.spawn('ls -l')
>>> child.expect(pexpect.EOF)
0
>>> print(child.before)
total 8
-rw-r--r-- 1 root root    0 Feb 21 19:18 log.txt
drwxr-xr-x 2 root root 4096 Feb 21 19:18 test
drwxr-xr-x 2 root root 4096 Feb 21 19:19 tttt

>>>
>>> child = pexpect.spawn('ls -l')
>>> child.expect('test')
0
>>> print(child.after)
test
>>> child.expect('ttt')
0
>>> print(child.after)
ttt
>>>

# 连续匹配 列表形式
>>> child = pexpect.spawn('ls -l')
>>> child.expect('test')
0
>>> print(child.after)
test
>>> child.expect('ttt')
0
>>> print(child.after)
ttt
>>>
>>> child = pexpect.spawn('ls -l')
>>> child.expect('test')
0
>>> child.expect(['test','ttt'])
1        # 1为ttt的列表索引,因为此前已经匹配过test,文件游标不会再匹配(test在前,tttt在后)
>>>

(2)sendline(s=’’)

bash展示

[root@xxxx-2021 ~]# nslookup
> https://www.jd.com/
Server:		10.138.48.2
Address:	10.138.48.2#53

Non-authoritative answer:
*** Can't find https://www.jd.com/: No answer
>

使用sendline实现以上命令行功能:

>>> import pexpect
>>> child = pexpect.spawn('nslookup')
>>> child.expect('>')
0
>>> child.sendline('https://www.jd.com/')
20
>>> child.expect('>')
0
>>> print(child.before.decode())
 https://www.jd.com/
Server:		10.138.48.2
Address:	10.138.48.2#53

Non-authoritative answer:
*** Can't find https://www.jd.com/: No answer

>>>

3.1.5 其他发送信息的方法

方法 描述
send(s) 类似于sendline(),只发送字符串给子程序;
不添加回车符(换行符);
打开了日志,则会添加到日志中;
返回已发送字节数;
write(s) 同send()方法,但无返回值;
writelines(sequense) 调用write()方法,将序列中内容发送
sendcontrol(char) 发送类似ctrl+d、ctrl+d等组合键
sendof() 发送一个结束符,一般用于确认上一次发送内容缓冲结束
sendintr() 发送退出信号

3.1.6 其他获取结果的方法

方法 描述
expect_exact() 用法与expect()方法相同,匹配速度更快;
除pattern不能用正则表达式
expect_list() 匹配列表只用已编译正则表达式和EOF、TIMEOUT;
提高匹配速度;
expect()方法是通过它工作的
read(size=-1) 从子程序输出中读取指定量数据。
size为-1时读取时直到EOF(当子程序退出后使用)
readline(size=-1) -1时直接读取一行数据;
0时返回为空;
其他值时被忽略,返回一行;
# send方法
>>> child = pexpect.spawn('nslookup')
>>> child.expect('>')
0
>>> child.send('www.baidu.com')
13
>>> child.send('\n')
1
>>> child.expect('>')
0
>>> print(child.before.decode())
 www.baidu.com
Server:		10.138.48.2
Address:	10.138.48.2#53

Non-authoritative answer:
www.baidu.com	canonical name = www.xxx.com.
Name:	www.xxx.com
Address: 100.59.200.6
Name:	www.xxx.com
Address: 100.59.200.7

# write方法
child.write('www.baidu.com\n')

# writelines方法
child.writelines(['www.baidu.com','\n'])

# sendintr方法 -- False表示子程序已经结束了
>>> child.sendintr()
>>> child.isalive()
False

3.1.7 其他常用方法

方法 描述
compile_pattern_list(patterns) 编译列表每一项的正则表达式;
当多次应用expect匹配时,每次会先对其列表实行编译后匹配;
为了提高效率,可以预先调用它进行编译;
之后直接使用expect_list()方法进行匹配
eof() 抛出过EOF错误,则返回真。
interact(escape_character=’\x\d’, input_filter=None, output_filter=None) 实现子程序和用户直接交互;
开启了日志,输入和输出会记录在日志文件中;
input_filter和output_filter用于对输入和输出进行过滤;传入的应是接受字符串参数并返回字符串的一个函数;
默认退出键为ctrl+]

3.1.8 控制子程序方法

方法 描述
kill(sig) 通过给子程序发送信号(signal);
   

到此这篇关于Python模块之pexpect详解的文章就介绍到这了,更多相关Python模块pexpect 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python pexpect模块及shell脚本except原理解析

    expect脚本 expect是什么 expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预.说白了,expect就是一套用来实现自动交互功能的软件. 在实际工作中,我们运行命令.脚本或程序时,这些命令.脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行.而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行 由于在linux中的一些命令不太适合于脚本的自动化运行,比如fdisk,telnet,ftp连接下载等,所以

  • 使用python的pexpect模块,实现远程免密登录的示例

    说明 当我们需要用脚本实现,远程登录或者远程操作的时候,都要去解决如何自动输入密码的问题,一般来说有3种实现方式: 1).配置公钥私钥 2).使用shell下的命令,expect 3).使用python的pexpect模块 下面介绍的代码,是使用python的pexpect模块实现的: 代码 import os import sys import pexpect import datetime #获取昨天的日期 date_yes = (datetime.date.today()-datetime

  • Python安装使用命令行交互模块pexpect的基础教程

    一.安装 1.安装easy_install工具 wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py 安装easy_install工具(这个脚本会自动去官网搜索下载并安装) python ez_setup.py -U setuptools 升级easy_install工具 2.安装pexpect easy_install Pexpect 测试一下: [root@OMS python]# python Pyth

  • python Pexpect模块的使用

    Pexpect简介 在讲解Pexpect之前,我们需要先了解一下Expect这个脚本语言,它是由TCL语言实现的,主要用于人机交互式对话的自动化控制,可以用来完成ssh.ftp.telnet等命令行程序的自动化交互.Pexpect其实就是一个用Python语言实现的类Expect功能的模块,通过它就可以在Python中完成Expect所完成的功能. Pexpect的基本工作流程,基本可以分为以下三个步骤: 首先用spawn来执行一个程序: 然后用expect方法来等待指定的关键字,这个关键字是被

  • 对Python Pexpect 模块的使用说明详解

    背景介绍 Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况.因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现.最初的第一个 Expect 是由 TCL 语言实现的,所以后来的 Expect 都大致参考了最初的用法和流程,整体来说大致的流程包括: 运行程序 程序要求人的判断和输入 Expect 通过关键字匹配 根据关键字向程序发送符合的字符串 TCL 语言实现的 Expect 功能非常强大,我曾经用它实现了防火墙

  • Python模块pexpect安装及使用流程

    目录 一.pexpect模块介绍 二.Pexpect的安装 三.pexpect的核心组件 3.1spawn类 3.1.1简介 3.1.2使用流程 3.1.4基本属性和方法 3.1.5其他发送信息的方法 3.1.6其他获取结果的方法 3.1.7其他常用方法 3.1.8控制子程序方法 一.pexpect模块介绍 Pexpect使Python成为控制其他应用程序的更好工具.可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet

  • python模块的安装以及安装失败的解决方法

    Python 模块安装 一. 打开命令提示符 win + R 输入 cmd 点击确定 或者win + S 搜索输入 cmd 二. 环境变量没有问题的前提下 输入安装命令 pip install 模块名 如果你要安装 requests 模块 就输入 pip install requests 回车 如果你要安装selenium 模块 就输入 pip install selenium 回车 - Requirement already satisfied: 表示之前已经安装过这个模块 下面的 WARNI

  • 详解python模块pychartdir安装及导入问题

    在迁移别人写好的脚本时,发现pychartdir没有导入,脚本执行报错.以下是报错内容: [modps@LGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py /etc/host.conf: line 1: bad command `nospoof on' Traceback (most recent call last): File "/opt/aspire/product

  • python cx_Oracle模块的安装和使用详细介绍

    python cx_Oracle模块的安装 最近需要写一个数据迁移脚本,将单一Oracle中的数据迁移到MySQL Sharding集群,在linux下安装cx_Oracle感觉还是有一点麻烦的,整理一下,做个总结. 对于Oracle客户端,不只需要安装相应的python模块(这里我用了Oracle官方的python模块--cx_Oracle),还需要安装Oracle Client,一般选择Instant Client就足够了,还需要配置tnsnames.ora(当然也可以简单的通过host:p

  • Python模块搜索概念介绍及模块安装方法介绍

    [import模块] 和C中的#include不同,Python中的import语句并不是简单的把一个文件插入另外一个文件. 导入其实是运行时的运算,程序第一次导入指定文件时,会执行以下步骤, 1. 找到模块文件 2. 编译成位码 3. 执行模块中的代码来创建所定义的模块 并生成.pyc字节码文件,这三个步骤只在程序执行时,模块第一次导入时会进行.之后导入相同的模块时,会跳过这三个步骤,而只提取内存中已加载的模块对象,速度要快的多. NOTE: 1. Python把已加载的模块放在内置的sys.

  • Python编程实现双击更新所有已安装python模块的方法

    本文实例讲述了Python编程实现双击更新所有已安装python模块的方法.分享给大家供大家参考,具体如下: 首先声明我是一个升级控.几乎每天会查看一下手机.电脑是否有新的应用需要更新. 同样,我的python模块也是这样.百度了一下,发现目前还没有人将更新所有模块做成一件命令,但是查到了指引,主要就是两个命令. pip list --outdated pip install -U xxxx 当然,如果你只是安装了几个python模块,重复执行几次命令也是可以的,也不会太烦,也不会浪费时间. 有

  • Python Paramiko模块的安装与使用详解

    一.前言 常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了.而使用paramiko可以很好的解决以上问题,比起前面的方法,它仅需要在本地上安装相应的软件(python以及PyCrypto),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助.下面本文就来详细的介绍Python Paramiko模块的安装与使用,一起学习学习吧.. 二.安装 安装paramik

  • 基于windows下pip安装python模块时报错总结

    这几天把python版本升级后,发现pip安装模块好多都报错(暂不确定是不是因为升级导致的),我定睛一看,发现是权限的问题,那么怎么解决呢? 1 权限问题 C:\Users\ljf>pip install xlwt Exception: Traceback (most recent call last): File "c:\program files\python35\lib\site-packages\pip\basecommand.py", line 21 1, in mai

  • 详解python 3.6 安装json 模块(simplejson)

    JSON 相关概念: 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象. JSON(Java Script Object Notation):一种轻量级数据交互格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集. python2.6版本开始加入了JSON模块,python的j

随机推荐