最近发现做了很多模拟,但是一些常规分析每次都需要进行查阅,套路化计算,我在想为何不能自动化每次模拟完自动执行一下呢?之前写了一个shell脚本的,现在看起来非常不高级,而且时间久了就会忘记,磨刀不误砍柴工,所以最近粗略的学习了Python自动化运维常用的两个模块,
Pexpect
和psutil
,在这里简单介绍一下。
Pexpect简介
Pexpect是一个终端自动交互python模块,十分易于上手
安装
安装可以通过pip或者conda,适用版本为Python2.7或者Python3.3以上
pip install pexpect
简单使用说明
其实使用方法在简书的Pexpect 模块使用说明总结的非常好,这里仅做快速简要介绍
spawn() - 执行程序
# 执行linux命令,返回的为结果
pexpect.spawn(command, args=[], timeout=30, logfile=None, cwd=None)
参数里面我列了几个觉得很重要的内容,一个是timeout
表示等待时间,logfile
表示写入的日志文件,cwd
表示根目录
expect() - 关键字匹配
# 正则匹配输出
expect(pattern, timeout=-1, searchwindowsize=-1, async_=False, **kw)
匹配后会返回值,若匹配的是一个字符串,匹配到了会返回0,若为一个列表,则匹配到了的话,会定位到列表的第几个关键字,从0开始计算
expect_loop(self, searcher, timeout=-1, searchwindowsize=-1)
用于从标准输入中获取内容,loop这个词代表它会进入一个循环,必须要从标准输入中获取到关键字才会往下继续执行。
send() -发送关键字
其实相当于Shell中echo -e
,我感觉
# 发送
send()
# 发送加空格
sendlines()
# 发送但没有返回值
write()
# 发送包含字符串的列表
# 类似于 write() 命令,只不过接受的是一个字符串列表,
# writelines() 会向子程序一条一条的发送列表中的元素,
#但是不会自动在每个元素的最后加上回车换行符。
writelines()
# 发送特殊字符,例如Ctrl-G
sendcontrol('g')
read() - 返回关键字
感觉应用不多
# 返回剩下的所有内容
read()
# 返回一行输出
readline()
# 返回列表模式的所有输出
readlines()
控制子程序
一些对于执行程序的操作
# 杀死子程序
kill()
# 查看是否存活
isalive()
# 等待直到子程序退出
wait()
# 关闭子程序
close()
# 子程序进程
pid
运行功能
# 运行linux命令,返回的为结果
pexpect.run(command, args=[], timeout=30, logfile=None, cwd=None)
可能大家对run()
和spwan()
之间的区别很好奇,run()
相比spwan()
为等待命令完全完成,然后才会返回结果
更多原创精彩视频敬请关注生信杂谈:
网友评论