8

別のプログラムを実行し、stdin を介してそれに値を渡し、stdout から応答を読み取り、応答を出力することになっている 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

私は間違いなくここで何か間違ったことをしています - これを実行すると、テキストを入力するのを待っているようです。何かを求められたくない - start./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

a brief working way:

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 / ...

for more examples including sending binary input: https://ruby-doc.org/stdlib-2.6.3/libdoc/open3/rdoc/Open3.html#method-c-capture3

于 2019-05-13T04:51:30.167 に答える