В настоящее время я пишу в stdin в цикле, когда stdout предоставляет мне маркер последней строки "EE \ n". Теперь он должен продолжаться до тех пор, пока цикл не будет прерван, но по какой-то причине stdout не предоставляет никаких новых строк на итерации 625 и т. Д. Я думаю, что проблема в том, что stdin не слушает или не захватывает новые путы.
Я пытался сделать это с помощью PTY.spawn вместо Open3.popen3, но безуспешно. Также я установил тайм-аут в ожидании и когда это произойдет, чтобы снова написать в stdin. У меня появилась идея оставить stdin открытым из этого поста:
ruby popen3 - как многократно писать в стандартный вывод и читать стандартный вывод без повторного открытия?
Мне нужно держать stdin открытым, потому что следующим шагом будет то, что stdout предоставляет новую информацию для stdin и т. Д.
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.