child 预期在 TIMEOUT 之前死亡

child dies before TIMEOUT in pexpect

我在 python 代码中使用 pexpect 到 运行 系统命令。在 运行 执行命令时,可能会或可能不会提示用户提出问题。如果出现提示,他必须回答 y。我希望这会自动发生。我写了下面的代码-

child = pexpect.spawn( "module load xyz" )
child.expect( "Are you sure you want to clear all loaded modules.*" )
child.sendline( "y" ) 

我的问题是,如果系统没有提示用户问题并且 child 在成功执行命令后死机,会发生什么情况?

谢谢

您可以将 expect 语句包装在 while 中以继续循环,并在 try/except 中包装以处理未找到预期 return 值的情况。这将允许您优雅地确定您已经到达进程输出的末尾,同时,如果需要,根据警告消息采取行动。

child = pexpect.spawn( "module load xyz" )
while child.isalive():
    try:
        child.expect( ""Are you sure you want to clear all loaded modules.*" )
        child.sendline( "y" )
    except EOF:
        pass

为此,您需要调用 from pexpect import EOF

不过,还有一点要注意。这将挂起,除非您将缓冲区设置为适当的大小(我从来没有用 pexpect 掌握它)或者您期望的字符串后跟一个换行符。如果这些都不是真的,您将挂起并且不知道为什么。老实说,我更喜欢用困难的方式来做,使用 subprocess.Popen,然后从 stdoutstderr 读取并写入 stdin.

再来一条评论。使用通配符时要小心。他们倾向于以奇怪的方式行事。鉴于您要查找的内容,您应该能够从预期的字符串中删除星号。

到 运行 命令并回答 'y' 如果问题是使用 pexpect:

#!/usr/bin/env python
import os
import pexpect # $ pip install pexpect

pexpect.run("module load xyz", events={
    "Are you sure you want to clear all loaded modules": "y" + os.linesep
})

如果您想直接使用 pexpect.spawn,那么简化版本可能如下所示:

#!/usr/bin/env python
import pexpect # $ pip install pexpect

child = pexpect.spawn("module load xyz")
while True:
    i = child.expect(["Are you sure you want to clear all loaded modules",
                      pexpect.EOF, pexpect.TIMEOUT])
    if i == 0:
        child.sendline('y')
    else: # child exited or the timeout happened
        break