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
,然后从 stdout
和 stderr
读取并写入 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
我在 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
,然后从 stdout
和 stderr
读取并写入 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