Захват STDOUT и STDERR внешней программы * во время * ее выполнения (Ruby)

Asked
Viewd1935

9

Сценарий:

Мне нужно вызвать внешнюю программу из моего скрипта Ruby, и эта программа отправляет много полезной (но загадочной) информации в stdout и stderr.

Пока программа работает , я хотел бы проанализировать строки, которые она отправляет на stdout и stderr и:

  • Удалите их, если в этом нет необходимости.
  • При необходимости отформатируйте / замените их.

Я пробовал все обычные уловки (system, exec, popen, popen3, обратные кавычки и т. д. и т. д.), но могу получить только stdout / stderr после выполнения программы, а не во время его выполнения.

Есть идеи?

О, и я в Windows :-(

  • Можете ли вы привести пример одной из ваших «уловок» (скажем, popen)?

    Kathy Van Stone30 октября 2009, 17:37
  • @jug: в Windows есть совершенно допустимые каналы.

    Adrien Plisson31 октября 2009, 08:25
  • Я думаю, в Windows нет каналов?

    j.p.30 октября 2009, 20:13

1 ответов

15

На самом деле, это было проще, чем я думал, похоже, это работает отлично:

 STDOUT.sync = true # That's all it takes...
IO.popen(command+" 2>&1") do |pipe| # Redirection is performed using operators
  pipe.sync = true
  while str = pipe.gets
    puts "-> "+str # This is synchronous!
  end
end
 

... и да, он работает в Windows!