最近发现做了很多模拟,但是一些常规分析每次都需要进行查阅,套路化计算,我在想为何不能自动化每次模拟完自动执行一下呢?之前写了一个shell脚本的,现在看起来非常不高级,而且时间久了就会忘记,磨刀不误砍柴工,所以最近粗略的学习了Python自动化运维常用的两个模块,Pexpectpsutil,在这里简单介绍一下。

Pexpect简介

Pexpect是一个终端自动交互python模块,十分易于上手

安装

安装可以通过pip或者conda,适用版本为Python2.7或者Python3.3以上

1
pip install pexpect

简单使用说明

其实使用方法在简书的Pexpect 模块使用说明总结的非常好,这里仅做快速简要介绍

spawn() - 执行程序

1
2
# 执行linux命令,返回的为结果
pexpect.spawn(command, args=[], timeout=30, logfile=None, cwd=None)

参数里面我列了几个觉得很重要的内容,一个是timeout表示等待时间,logfile表示写入的日志文件,cwd表示根目录

expect() - 关键字匹配

1
2
# 正则匹配输出
expect(pattern, timeout=-1, searchwindowsize=-1, async_=False, **kw)

匹配后会返回值,若匹配的是一个字符串,匹配到了会返回0,若为一个列表,则匹配到了的话,会定位到列表的第几个关键字,从0开始计算

1
expect_loop(self, searcher, timeout=-1, searchwindowsize=-1)

用于从标准输入中获取内容,loop这个词代表它会进入一个循环,必须要从标准输入中获取到关键字才会往下继续执行。

send() -发送关键字

其实相当于Shell中echo -e,我感觉

1
2
3
4
5
6
7
8
9
10
11
12
13
# 发送
send()
# 发送加空格
sendlines()
# 发送但没有返回值
write()
# 发送包含字符串的列表
# 类似于 write() 命令,只不过接受的是一个字符串列表,
# writelines() 会向子程序一条一条的发送列表中的元素,
#但是不会自动在每个元素的最后加上回车换行符。
writelines()
# 发送特殊字符,例如Ctrl-G
sendcontrol('g')

read() - 返回关键字

感觉应用不多

1
2
3
4
5
6
# 返回剩下的所有内容
read()
# 返回一行输出
readline()
# 返回列表模式的所有输出
readlines()

控制子程序

一些对于执行程序的操作

1
2
3
4
5
6
7
8
9
10
# 杀死子程序
kill()
# 查看是否存活
isalive()
# 等待直到子程序退出
wait()
# 关闭子程序
close()
# 子程序进程
pid

运行功能

1
2
# 运行linux命令,返回的为结果
pexpect.run(command, args=[], timeout=30, logfile=None, cwd=None)

可能大家对run()spwan()之间的区别很好奇,run()相比spwan()为等待命令完全完成,然后才会返回结果