2013-10-10 6 views
3

Я пишу программу ruby, которая должна выполнять другую программу, передавать ей значения через stdin, читать ответ со своего stdout и затем печатать ответ. Это то, что у меня есть до сих пор.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!", вернуть ответ и распечатать ответ на экране. Как мне это сделать?

EDIT

Только в случае, если это имеет значение, MyProgram в основном программа, которая не продолжает работать до конца файла, чтение в и распечатав вещи.

+0

Какой код '/ MyProgram' содержит.? –

+0

Это имеет значение? – Kvass

+0

Можете ли вы сделать просто 'p Open3.popen3 ('./ MyProgram')'? –

ответ

9

Попробуйте закрыть stdin перед чтением вывода. Вот пример:

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

Вот более succint способ написания его с помощью Open3::capture3: (остерегайтесь, непроверенных!)

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

Работал. Примут в 4 мин: P – Kvass

+0

Я рад, что это сработало! – nurettin

+0

, пока вы отвечаете, пожалуйста, предоставьте ссылки на документацию также ... –

Смежные вопросы