我在python代码中使用pexpect来运行系统命令。在运行命令时,可能会或可能不会向用户提示问题。如果提示他必须回答y。我希望这会自动发生。我写了以下代码 -
child = pexpect.spawn( "module load xyz" )
child.expect( "Are you sure you want to clear all loaded modules.*" )
child.sendline( "y" )
我的问题是如果系统没有提示用户提出问题并且孩子在成功执行命令后死亡会发生什么?
由于
答案 0 :(得分:2)
您可以将expect
语句包装在while
中以继续循环并尝试/除以处理未找到预期返回值的情况。这样您就可以优雅地确定您已经完成了流程的结束。输出,同时,如果需要,对警告信息采取行动。
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
。
还有一条评论。使用通配符要小心。他们往往表现得很奇怪。鉴于您正在寻找什么,您应该能够从预期的字符串中删除星号。
答案 1 :(得分:1)
如果使用'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