Pexpect介绍
因为要通过python执行脚本,而且有交互,需要输入密码才可以继续进行,就找到了Pexpect,Pexpect makes Python a better tool for controlling other applications.
想使用pexpect.expect功能
问题
之前我找了半天,通过spawn执行命令,都是因为不在对应目录下,最后发现spawn也支持cwd参数,就用上了,问题解决了
安装
既然知道这个库,安装应该都不是问题,就是使用pip即可,现在版本已经更新到4.8
pip3 install pexpect
使用
以实例来说一下使用知识,具体可以查阅相关资料
import pexpect
child = pexpect.spawn("sh ./code.sh", logfile=sys.stdout.buffer,cwd="/Users/guozhonghui/Downloads/Tag_Generator/")
child.expect("Password:")
child.sendline("gzh1818")
child.expect("images")
spawn
spawn() 方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作,很强大。
- timeout指定交互是等待的超时值;
- maxread设置read buffer大小. 每次pexpect尝试从TTY(Teletype终端)从读取的最大字节数;
- searchwindowsize 指定了从输入缓冲区中进行模式匹配的位置,默认从开始匹配;
- logfile 参数指定日志的记录位置,设置sys.stdout.buffer,可以将结果打印到控制台。
- cmd指定命令执行的目录,默认值: None 或者说 ./,cwd 用来指定命令发送的命令在哪个路径下执行,它一般是用在 send() 系列命令中,比如在 Linux 中,你想在 /etc 目录下执行 ls –l 命令,那么完全不需要用 sendline(“cd /etc && ls -l”) 这样的方式,而是用 sendline(“ls –l”, cwd="/etc") 就可以了。
expect
检测交互过程的输出并进行相应的输入。如下文就是检测是否输出Password,
child.expect("Password:")
child.sendline("188888")
然后sendline就是输入字符串到应用中,如输出结果就是:
Password:188888