Ruby:如何向stdin输入并从stdout读取?

9

我正在编写一个Ruby程序,它可以执行另一个程序,并通过标准输入向其传递值,从其标准输出读取响应,然后打印响应。以下是我的代码:

#!/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的程序,读取并打印出内容。

./MyProgram 包含什么代码? - Arup Rakshit
1
你能只用 p Open3.popen3('./MyProgram') 吗? - Arup Rakshit
问题通常在于子程序想要完全读取其STDIN,然后再尝试处理所读取的内容并输出结果。这意味着您必须关闭传递给子程序的STDIN句柄,然后子程序知道可以完成其处理。这类似于父代码在完成处理之前读取文件到结尾。 - the Tin Man
2个回答

14
尝试在读取输出之前关闭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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接