[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"