Всем привет,
Мне нужно запустить потенциально длительный процесс из Ruby 1.9.2 в Windows, а затем захватить и проанализировать данные из стандартного вывода и ошибки внешнего процесса. Каждому может быть отправлено большое количество данных, но меня интересует только одна строка за раз (а не захват и сохранение всего вывода).
После небольшого исследования я обнаружил, что класс Open3 позаботьтесь о выполнении процесса и предоставлении мне объектов IO
, связанных с процессом стандартный вывод и ошибка (через popen3).
Open3.popen3("external-program.bat") do |stdin, out, err, thread|
# Step3.profit() ?
end
Однако я не уверен, как постоянно читать из обоих потоков, не блокируя программу. Поскольку вызов IO#readlines
на out
или err
, когда отправлено много данных, приводит к ошибке выделения памяти, я пытаюсь постоянно проверять оба потока на наличие доступных входных данных, но мне не повезло ни с одной из моих реализаций.
Заранее благодарю за любой совет!