从Ruby运行交互式程序

时间:2014-10-31 19:24:54

标签: ruby stdout popen interactive

我正在尝试从ruby运行gnuplot(不使用外部gem)并解析其文本输出。我尝试了IO.popenPTY.spawnOpen3.popen3,但每当我尝试获取输出时,它就会挂起"挂起" - 我想等待更多输出来。我觉得使用Thread.new以某种方式完成了它,但我无法找到实现它的正确方法。

任何人都知道它是如何完成的?

2 个答案:

答案 0 :(得分:3)

我想这就是你想要的:

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

答案 1 :(得分:1)

问题是子程序正在等待未发送的输入。

通常,当我们调用期望在STDIN上输入的程序时,我们必须关闭STDIN,然后STDIN发信号通知该程序开始处理。查看各种Open3方法,您会在许多示例中看​​到stdin.close出现的位置,但它们无法解释原因。

Open3还包括capture2capture3,这使得它在尝试处理想要STDIN的程序时很好,而且你没有任何东西要发送给它。在这两种方法中,STDIN立即关闭,该方法返回被调用程序的STDOUT,STDERR和退出状态。


你需要"期待"功能。 Ruby的Pty类包含expect方法。

  

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

虽然它没有很好的记录,但并没有提供我所见过的很多功能。可以在" Using Ruby Expect Library to Reboot Ruckus Wireless Access Points via ssh"。

中找到其使用示例

相反,您可能希望查看RubyExpect哪个文档更好,并且看起来是最新的。