Windows+Rubyで外部プログラムの標準エラー出力を受け取る"win32-open3"

Rubyでは、外部プログラムを実行するメソッドが用意されている。
例えば、lsコマンドを実行したかったら、

result = exec "ls"

もしくはバッククウォートを用いて

result = `ls`

と書く。すると、lsの実行結果の標準出力が、文字列となってresultに格納される。

ここで問題なのは、標準エラー出力をするような外部プログラムを実行した場合、その標準エラー出力の内容がこの方法では得られないという点。

そこで使うのは、添付ライブラリのopen3である。

Rubyリファレンスマニュアル - open3
http://www.ruby-lang.org/ja/man/?cmd=view;name=open3

Open3を用いることで、外部プログラムを実行しつつ、それに対応する標準入力、標準出力、標準エラー出力の3つ組を得ることができる。

WindowsでOpen3

しかし、このOpen3というライブラリはWindowsでは動作しないようだ。
マニュアルにもあるが、win32-open3というライブラリをgemで持ってくる必要がある。

RubyForge Win32 Utils ファイルリスト
http://rubyforge.org/frs/?group_id=85

ここで、これを執筆している2007/11/1当時では、

  • win32-open3-0.2.5.gem
  • win32-open3-0.2.5-mswin32.gem

がある。
ここでは、前者はうまくインストールできなかったので、後者をダウンロードする。
そしていつものように、

$ gem install win32-open3-0.2.5-mswin32.gem

とすればOpen3のインストールは完了。

win32-open3の基本的な使い方は以下の通り。

require 'win32/open3'  # ハイフンではなくスラッシュなので注意
Open3.popen3("command") do |stdin, stdout, stderr|
  stdin.write("hoge")
  puts stdout.read
  puts stdout.read
end