pythonpip安装模块,python pexpect模块详解
Pexpect使Python成为控制其他应用程序的更好工具。本文主要介绍Python模块中pexpect的安装和使用过程,有需要的朋友可以参考一下。
00-1010一、pexpect模块二介绍。安装Pexpect III。pexpect 3.1类核心组件介绍3.1.1 3.1使用流程3.1.4基本属性和方法3.1.5其他发送信息的方法3.1.6其他获取结果的方法3.1.7其他常用方法3.1.1
目录
Pexpect使Python成为控制其他应用程序的更好工具。可以理解为Linux下expect的Python包。通过Expect,我们可以自动与ssh、ftp、passwd、telnet等命令行交互,无需人工干预。
一、pexpect模块介绍
#python2
pip安装pexpect
#python3
pip3安装pexpect
二、Pexpect的安装
三、pexpect的核心组件
3.1 spawn类
它是Pexpect库的主要对象,也就是接口类,用来启动和控制子程序。
3.1.1 简介
建立spawn类的实例,并传入要运行的命令。调用spawn类的实例方法与子命令交互。通过交互信息,完成要实现的相关功能。3.1.3施工方法参数
参数命令任何系统可执行的命令。
参数可以直接放入命令中。
不直接支持管道、通配符、标志输入、输出和错误重定向。args=[]特意把command命令的参数放到这个列表里。
以/bin/bash ,[-c , cat test grepgree]的形式
实现流水线、通配符、标志输入、输出、错误重定向等功能。timeout=30超过了时间,并引发错误maxread=2000。从TTY读取信息的最大缓冲区logfile=None指定日志文件,可以指定为sys.stdoutcwd=None以指定命令运行时的当前目录env=None以指定命令运行时中的编码=None环境变量。当命令运行时,信息编码codec _ errors= strict 在编码转换期间变成(1)命令
导入预期
child=PE expect . spawn( ls )
child . expect(PE expect。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=PE expect . spawn( ls-l/home )
child . expect(PE expect。EOF)
0
gt;> 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='')
after:匹配成功的内容
match:已匹配的匹配对象,匹配失败为None
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:
*** Cant 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:
*** Cant find https://www.jd.com/: No answer
>>>
3.1.5 其他发送信息的方法
方法 描述
不添加回车符(换行符);
打开了日志,则会添加到日志中;
返回已发送字节数;
3.1.6 其他获取结果的方法
方法 描述
除pattern不能用正则表达式
提高匹配速度;
expect()方法是通过它工作的
size为-1时读取时直到EOF(当子程序退出后使用)
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 其他常用方法
方法 描述
当多次应用expect匹配时,每次会先对其列表实行编译后匹配;
为了提高效率,可以预先调用它进行编译;
之后直接使用expect_list()方法进行匹配
开启了日志,输入和输出会记录在日志文件中;
input_filter和output_filter用于对输入和输出进行过滤;传入的应是接受字符串参数并返回字符串的一个函数;
默认退出键为
ctrl+]
3.1.8 控制子程序方法
方法 描述
到此这篇关于Python模块之pexpect详解的文章就介绍到这了,更多相关Python模块pexpect 内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。