Ruby:写入stdin并从stdout读取?

时间:2013-10-10 18:08:11

标签: ruby

我正在编写一个ruby程序,该程序应该执行另一个程序,通过stdin将值传递给它,从stdout读取响应,然后打印响应。这是我到目前为止所做的。

#!/usr/bin/env ruby

require 'open3'

stdin, stdout, stderr = Open3.popen3('./MyProgram')

stdin.puts "hello world!"

output = stdout.read
errors = stderr.read

stdin.close
stdout.close
stderr.close

puts "Output:"
puts "-------"
puts output
puts "\nErrors:"
puts "-------"
puts errors

我肯定在这里做错了 - 当我跑这个时,似乎在等我输入文字。我不想被提示做任何事情 - 我想开始./MyProgram,传入"hello world!",取回回复,然后在屏幕上打印回复。我该怎么做?

修改

以防万一,MyProgram基本上是一个程序,一直运行到EOF,读入并打印出来。

2 个答案:

答案 0 :(得分:10)

在读取输出之前尝试关闭stdin。这是一个例子:

require 'open3'
Open3.popen3("./MyProgram") do |i, o, e, t|
  i.write "Hello World!"
  i.close
  puts o.read
end

这是使用Open3::capture3编写它的更简洁方式:(小心,未经测试!)

o, e, s= Open3.capture3("./MyProgram", stdin_data: "Hello World!")
puts o

答案 1 :(得分:0)

一种简单的工作方式:

require 'open3'

out, err, status = Open3.capture3("./parser", stdin_data: "hello world")

out # string with standard output
err # string with error output
status.success? # true/false
status.exitstatus # 0 / 1 / ...

有关更多示例,包括发送二进制输入:https://ruby-doc.org/stdlib-2.6.3/libdoc/open3/rdoc/Open3.html#method-c-capture3