8

我正在编写一个 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,读入并打印出东西。

4

2 回答 2

12

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

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
于 2013-10-10T18:17:32.983 回答
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

于 2019-05-13T04:51:30.167 回答