【发布时间】:2014-04-04 01:01:39
【问题描述】:
我正在使用Open3 的popen3 方法启动一个进程,该进程以类似控制台/REPL 的方式运行,以重复接受输入并返回输出。
我可以正常打开进程、发送输入和接收输出,代码如下:
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
【问题讨论】: