Open3

[2001/02/05] るびきち[外部]

open3.rb

perlにあるopen3のruby版。

使い方

その1

require "open3" 

inn, out, err = Open3.popen3('nroff -man')

その2

include Open3
inn, out, err = popen3('nroff -man')

その3

class String
  def external_filter (prog)
    require 'open3'

    pipe = Open3.popen3(prog)
    pipe[0] .print self
    pipe[0] .close
    pipe[1] .read
  end
end
String#external_filter(prog)

Stringを標準入力として外部プログラムprogを起動し、標準出力をStringとして返す。 標準添付希望。

その3修正版

[2001/06/18] ゆん[外部]

このまんまだとバッファサイズの関係で、 文字列がでかい時にパイプが詰まってロックがかかっちゃうみたいなんで、 このくらいの方がいいみたい。

んでもって標準添付希望ー。

class String
  def external_filter (prog)
    require 'open3'

    pipe = Open3.popen3(prog)

    Thread.start do
      s = 0
      while s < size
        s += pipe[0].write(self[s, 1024])
      end
      pipe[0].close
    end

    pipe[1] .read
  end
end

モジュール関数

Open3.popen3(cmd)

外部プログラムcmdを実行し、そのプロセスの標準入力、標準出力、 標準エラー出力に接続されたパイプを3要素の配列で返す。 cmdexecと同じ規則で解釈される。

ブロックを指定するとパイプの配列を引数にブロックを実行し、最後に パイプを close する。この場合はブロックの最後の式の結果を返す。

require 'open3'

Open3.popen3("read stdin; echo stdout; echo stderr >&2") {|stdin, stdout, stderr|

  stdin.puts "stdin"
  p stdout.read
  p stderr.read
}
#=> "stdout\n"
    "stderr\n"