[2001/02/05] るびきち[外部]
perlにあるopen3のruby版。
require "open3"
inn, out, err = Open3.popen3('nroff -man')
include Open3
inn, out, err = popen3('nroff -man')
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として返す。 標準添付希望。
[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要素の配列で返す。 cmd は execと同じ規則で解釈される。
ブロックを指定するとパイプの配列を引数にブロックを実行し、最後に パイプを 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"