目前,当标准输出为我提供最后一个行标记“EE\n”时,我正在循环写入标准输入。现在它应该一直持续到循环终止,但由于某种原因,stdout 在迭代 625 等处没有提供任何新行,我认为问题在于 stdin 没有监听或捕获新的 put。
我试过用 PTY.spawn 而不是 Open3.popen3 来做,但没有运气。此外,我在期望中设置了一个超时,当这种情况发生时再次写入标准输入。我从这篇文章中得到了保持标准输入打开的想法: ruby popen3 -- 如何在不重新打开进程的情况下重复写入标准输入和读取标准输出?
我需要保持标准输入打开,因为下一步将是标准输出为标准输入等提供新信息。
def testen()
Open3.popen3("./pos.tx") do |stdin, stdout, stderr, wait_thr|
stdin.sync = true
stdout.sync = true
stdin.puts "e0"
count = 0
while true
stdout.expect("\n") do |result|
if result[0] == "EE\n"
# sleep(0.1)
count +=1
print count.to_s+"\n"
stdin.puts "e0"
end
end
end
stdin.close
# status = wait_thr.value
stdout_str = stdout.read
print stdout_str
end
end
testen
所以这段代码最终打印出 625 ,这意味着 625 成功stdin.puts "e0"
。但它应该一直持续下去,直到出现一些用户干扰,例如ctrl c
.
解决方案
我没有从 stderr 读取导致完整的管道,现在我使用 popen2。