ruby - Ruby popen3 - 如何防止重复写入标准输入导致超时?
问题描述
目前,当标准输出为我提供最后一个行标记“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。
解决方案
推荐阅读
- python - 如何将 JSON 中的系列扩展到列?
- android - 如何使用 Firebase 更新 Android 应用的 API 密钥、projectID 和 AppID?
- python - 使用 rasterio 重新采样栅格 - 网格间距的简单修改
- ros - 为什么机器人不能正确跟随路径?
- python - 如何将 HTML 链接到 python 脚本
- javascript - 如何正确使用此过滤器?
- jquery - 如何使用 jquery 编写 greentext 模块
- python - 表示任意分层数据的最佳数据结构是什么?
- javascript - 有没有办法克隆一个已经渲染的 React 组件,包括它的本地状态?
- python - 未安装模块“材料”