Реализация замены для Ruby IO.popen () и system () - PullRequest
12 голосов
/ 30 сентября 2008

IO.popen () и system () в Ruby катастрофически не хватает нескольких полезных функций, таких как:

  • получение возвращаемого значения функции
  • захват как stdout, так и stderr (отдельно и слитно)
  • работает без запуска дополнительного процесса cmd.exe или / bin / sh

В Python есть модуль «подпроцесс», который я подумывал использовать в качестве вдохновения для аналогичного модуля в Ruby. Теперь к вопросам:

  • Как Ruby-программисты работают над вышеуказанными проблемами, например, получают возвращаемое значение при выполнении вызова popen ()?
  • Это уже реализовано?

Ответы [ 3 ]

9 голосов
/ 01 октября 2008

Взгляните на стандартную библиотеку Ruby open3 . Это даст вам доступ к stdin, stdout и stderr.

Существует также внешний проект под названием open4 , который позволяет получить статус выхода без использования имени магической переменной.

9 голосов
/ 30 сентября 2008
  • Состояние выхода из системы () может быть зафиксировано с помощью $?.exitstatus
  • stderr может быть захвачен чем-то вроде system 'command 2>&1'
1 голос
/ 01 октября 2008

Я чувствовал необходимость сделать именно это при тестировании git_remote_branch. Инструмент вызывает оболочку, и я хотел точно захватить то, что отображалось во время тестовых прогонов, независимо от того, что отображал git, и неважно, выплевывалось ли оно в stdout или stderr.

У меня есть модуль, который можно использовать многократно и который можно наблюдать здесь (лицензия MIT: используйте по желанию, просто не судитесь со мной; -)

Вы можете увидеть это в действии в тестах для git_remote_branch здесь .

Кроме того, я настроил репо специально для capture_fu , в него входят некоторые тесты и прочее. Проект не очень хорошо настроен, хотя. Я не потратил много времени на то, чтобы сделать его доступным; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...