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库解决自动化交互问题?

5 回复

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.systemsubprocess
  • expect()返回匹配到的模式索引,支持列表匹配多个可能
  • sendline()自动加换行符,比send()方便
  • before属性包含上次匹配之前的所有输出
  • 处理超时和EOF避免卡死

实际用的时候注意编码问题,Linux下默认utf-8,Windows可能需要指定。匹配模式可以用正则,比如child.expect(r'\$')匹配命令提示符。

简单说就是:启动进程、等提示、发指令、收结果。

正文说了输出日志完全相同啊……

wai 了没有

歪了没有?
这里不用 wait 吧

回到顶部