我正在尝试从ruby运行gnuplot(不使用外部gem)并解析其文本输出。我尝试了IO.popen
,PTY.spawn
和Open3.popen3
,但每当我尝试获取输出时,它就会挂起"挂起" - 我想等待更多输出来。我觉得使用Thread.new
以某种方式完成了它,但我无法找到实现它的正确方法。
任何人都知道它是如何完成的?
答案 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还包括capture2
和capture3
,这使得它在尝试处理想要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哪个文档更好,并且看起来是最新的。