从Ruby运行交互式程序

我试图从ruby运行gnuplot(不使用外部gem)并解析其文本输出。 我尝试过IO.popenPTY.spawnOpen3.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还包括capture2capture3 ,这使得它在尝试处理想要STDIN的程序时很好,而且你没有任何东西要发送给它。 在这两种方法中,STDIN立即关闭,并且该方法返回被调用程序的STDOUT,STDERR和退出状态。


您需要“期望”function。 Ruby的Pty类包含expect方法。

创建和管理伪终端(PTY)。 另请参见en.wikipedia.org/wiki/Pseudo_terminal

虽然它没有很好的文档记录,但并没有提供我所见过的很多function。 “ 使用Ruby Expect Library通过ssh重新启动Ruckus无线接入点 ”中提供了它的一个使用示例。

相反,您可能希望查看RubyExpect ,它更好地记录并且看起来是最新的。