Zac*_*c B 8 python pexpect spawn
语境:
我有一些使用的代码pexpect,其工作是给出一个命令的"实时"输出.即,当命令生成一些输出时或不久之后打印出一些内容,而不是等到命令完成然后与其输出交互.
我正在做的就是启动和停止服务.我spawn通过该过程执行此操作,然后在打印时输出每一行,如下所示:
def watch(process):
output = ""
while True:
try:
line = process.read_nonblocking(timeout = -1)
print(line, end ="")
output += line
except pexpect.EOF:
break
del process
return output
while True:
print("IN 1")
process = pexpect.spawn("service",["zend-server", "stop"], timeout = None)
watch(process)
print("OUT 1")
print("IN 2")
process = pexpect.spawn("service",["zend-server", "start"], timeout = None)
watch(process)
print("OUT 2")
Run Code Online (Sandbox Code Playgroud)
这段代码应该只循环服务:启动它并反复停止它,打印开始/停止的输出.它打印输出正常.但是,它最终会在"OUT 2"之前挂起.我可以查看输出,并看到service调用停止执行.但是,该watch功能从不会提高EOF并退出.
每项服务都不会发生这种情况.有些服务无限循环.zend-server但是,与其他一些不相关的命令一起,以相同的方式间歇性地失败.
通过"最终挂起",我的意思是它启动/停止服务一些(每次运行变量)次,并挂起.它通常在4-6之后长大,虽然从来没有在第一次通话 - 总是至少在第二次(因此del声明;我认为我会安全地玩).
Python 2.6.6,CentOS(64)6.3,Pexpect 2.3-6,FWIW
题:
为什么pexpect挂在某些命令上?我该如何解决这个问题?使用超时不是一个可行的解决方案,因为其中一些命令实际上可以运行任意长时间.service zend-server stop只是我选择的一个例子,因为它不需要那么长时间,我可以观察它完成.
我试过的:
我已经尝试用以下watch方法替换该方法expect('\n'),但结果是相同的:可变数量的重新启动,然后是最终挂起.
我也可以添加pexpect.EOF到expect与之一起编辑的数组中\n,并处理返回值以突破循环,它仍然挂在同一个地方.
def watch2(process):
output = ""
done = False
while True:
try:
if not process.isalive():
line = process.readline()
done = True
else:
process.expect(['\n'])
line = process.before
print(line)
output += line
if done:
raise pexpect.EOF(0)
except pexpect.EOF:
break
del process
return output
Run Code Online (Sandbox Code Playgroud)