从Ruby运行交互式程序
我试图从ruby运行gnuplot(不使用外部gem)并解析其文本输出。 我尝试过IO.popen
, PTY.spawn
和Open3.popen3
但每当我尝试获取输出时它就会“挂起” – 我想等待更多的输出来。 我觉得它以某种方式完成了使用Thread.new
但我找不到正确的方法来实现它。
有谁知道它是如何完成的?
我想这就是你想要的:
require 'pty' require 'expect' PTY.spawn('gnuplot') do |input, output, pid| str = input.expect(/gnuplot>/) puts str output.puts "mlqksdf" str = input.expect(/gnuplot>/) puts str output.puts "exit" end
问题是子程序正在等待未发送的输入。
通常,当我们调用一个期望在STDIN上输入的程序时,我们必须关闭STDIN,然后STDIN指示该程序开始处理。 查看各种Open3方法,您将看到stdin.close
在许多示例中出现的位置,但它们无法解释原因。
Open3还包括capture2
和capture3
,这使得它在尝试处理想要STDIN的程序时很好,而且你没有任何东西要发送给它。 在这两种方法中,STDIN立即关闭,并且该方法返回被调用程序的STDOUT,STDERR和退出状态。
您需要“期望”function。 Ruby的Pty类包含expect
方法。
创建和管理伪终端(PTY)。 另请参见en.wikipedia.org/wiki/Pseudo_terminal
虽然它没有很好的文档记录,但并没有提供我所见过的很多function。 “ 使用Ruby Expect Library通过ssh重新启动Ruckus无线接入点 ”中提供了它的一个使用示例。
相反,您可能希望查看RubyExpect ,它更好地记录并且看起来是最新的。