ruby popen3 - как многократно писать на стандартный ввод и читать стандартный вывод без повторного открытия?
я используюopen3«spopen3 метод для запуска процесса, который функционирует в виде консоли /РЕПЛ мода многократно принимать входные и выходные данные.
Я могу открыть процесс, отправить ввод и получить вывод просто отлично, с кодом, подобным этому:
Open3.popen3("console_REPL_process") do |stdin, stdout, stderr, wait_thr|
stdin.puts "a string of input"
stdin.close_write
stdout.each_line { |line| puts line } #successfully prints all the output
end
Я хочу делать это много раз подряд, без повторного открытия процесса, так как для запуска требуется много времени.
Я знаю, что должен закрыть стандартный ввод, чтобы вернуть стандартный вывод ... но я не знаю,как мне «открыть» стандартный ввод, чтобы я мог написать больше входных данных?
В идеале я хочу сделать что-то вроде этого:
Open3.popen3("console_REPL_process") do |stdin, stdout, stderr, wait_thr|
stdin.puts "a string of input"
stdin.close_write
stdout.each_line { |line| puts line }
stdin.reopen_somehow()
stdin.puts "another string of input"
stdin.close_write
stdout.each_line { |line| puts line }
# etc..
end
решениеБлагодаря ответу pmoo, я смог найти решение, используяPTY
а такжеexpect
ожидая строку подсказки, которую процесс возвращает всякий раз, когда он готов для дополнительного ввода, например так:
PTY.spawn("console_REPL_process") do |output, input|
output.expect("prompt >") do |result|
input.puts "string of input"
end
output.expect("prompt >") do |result|
puts result
input.puts "another string of input"
end
output.expect("prompt >") do |result|
puts result
input.puts "a third string of input"
end
# and so forth
end