ruby popen3 – 如何反复写入stdin并读取stdout而无需重新打开过
发布时间:2020-12-16 19:01:35 所属栏目:百科 来源:网络整理
导读:我正在使用 Open3的 popen3方法启动一个以类似控制台/ REPL方式运行的进程,以反复接受输入和返回输出. 我可以打开进程,发送输入,并接收输出就好了,代码如下: Open3.popen3("console_REPL_process") do |stdin,stdout,stderr,wait_thr| stdin.puts "a string
我正在使用
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 我想连续多次这样做,而不需要重新打开过程,因为启动需要很长时间. 我知道我必须关闭stdin才能让stdout返回..但我不知道的是,我如何重新打开’stdin以便我可以写更多输入? 理想情况下,我想做这样的事情: Open3.popen3("console_REPL_process") do |stdin,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设计一个解决方案并期望,只要它准备好接收更多输入,就会期望进程返回的提示字符串,如下所示: 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 解决方法
您可以使用expect库获得一些成功,并让子进程明确标记每个输出的结尾,如:
require 'expect' require 'open3' Open3.popen3("/bin/bash") do | input,output,error,wait_thr | input.sync = true output.sync = true input.puts "ls /tmp" input.puts "echo '----'" puts output.expect("----",5) input.puts "cal apr 2014" input.puts "echo '----'" puts output.expect("----",5) end 作为奖励,期望有超时选项. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |