Python中如何使用Pexpect库解决自动化交互问题?
#系统环境:
Centos 7 X64
Python 3
##示例 1:
import pexpect
with open(‘ftp.log’, “w”) as f:
child =pexpect.spawn(‘yum remove ftp’, encoding=‘utf-8’,logfile=f,searchwindowsize=20)
child.expect(’[y/N]’)
child.sendline(‘y’)
##示例 2:
import pexpect
def test():
with open(‘test.log’, “w”) as f:
child =pexpect.spawn(‘yum remove ftp’, encoding=‘utf-8’,logfile=f,searchwindowsize=20)
child.expect(’[y/N]’)
child.sendline(‘y’)
test()
以上两段代码,使用示例 1 可以卸载 ftp,但在示例 2 中却无法卸载 ftp, 而 ftp.log 和 test.log 的输出是相同的,对,完全相同! 代码不同之处仅仅是示例 2 中的代码封装成了函数而已, 实在不明白为什么示例 2 无法按照预期进行操作, 莫非这个问题是库的坑?#手动滑稽
Python中如何使用Pexpect库解决自动化交互问题?
child.before 看看呗
用Pexpect做自动化交互,核心就三点:spawn启动进程、expect匹配输出、send发送指令。直接看代码:
import pexpect
# 1. 启动子进程
child = pexpect.spawn('ssh user@hostname')
# 2. 等待特定提示并响应
index = child.expect(['password:', pexpect.TIMEOUT, pexpect.EOF])
if index == 0:
child.sendline('your_password') # 发送密码
child.expect('$') # 等待命令提示符
child.sendline('ls -la') # 执行命令
child.expect('$')
print(child.before.decode()) # 获取命令输出
elif index == 1:
print("连接超时")
elif index == 2:
print("连接异常结束")
# 3. 记得关闭
child.close()
关键点:
spawn()启动进程,别用os.system或subprocessexpect()返回匹配到的模式索引,支持列表匹配多个可能sendline()自动加换行符,比send()方便before属性包含上次匹配之前的所有输出- 处理超时和EOF避免卡死
实际用的时候注意编码问题,Linux下默认utf-8,Windows可能需要指定。匹配模式可以用正则,比如child.expect(r'\$')匹配命令提示符。
简单说就是:启动进程、等提示、发指令、收结果。
正文说了输出日志完全相同啊……
wai 了没有
歪了没有?
这里不用 wait 吧

