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