私は多くの私のperlをscalaに置き換えることを考えています。私がたくさんする傾向があるのは、私の会社の他のチームから私に提供されるバイナリ(通常はC++のコンパイルですが、java、他のperlスクリプト、qスクリプトなど)です。スカラ - 外部プロセスが終了したときにコールバックを取得する
たとえば、いくつかの複雑な数学を実行するには、私は外国のバイナリの1つを開始し、それに入力をパイプします。その後、stdout
ストリームの結果と、stderr
ストリームの診断メッセージを聞きます。 perlでは、私はPOE::Wheel::Run
ウィジェットを使ってこれを行います。私はスカラーで類似した(そしてより良い)ものを思いついたが、もっと頑強にしたい。それはProcessIO
オブジェクトの周りの小さなラッパーです。
o: LOWER
をこれが私の90%を取得しますが、何が次のようになります。プリントアウトし
val exe = new Exe("tr [a-z] [A-Z]",
out => println("o: " + out),
err => println("e: " + err))
exe.write("lower")
exe.close()
:私は、このようにそれを使用したい
class Exe(command: String, out: String => Unit, err: String => Unit) {
import scala.sys.process._
import scala.io._
import java.io._
import scala.concurrent._
val inputStream = new SyncVar[OutputStream];
val process = Process(command).run(
new ProcessIO(
stdin => inputStream.put(stdin),
stdout => Source.fromInputStream(stdout).getLines.foreach(out),
stderr => Source.fromInputStream(stderr).getLines.foreach(err)));
def write(s: String): Unit = synchronized {
inputStream.get.write((s + "\n").getBytes)
}
def close(): Unit = {
inputStream.get.close
}
}
:それはこのようになりますniceは、プロセスが終了したときにコールバックを取得することです。入力ストリームを閉じて内部ループが停止したり、単独で終了したり、終了したりする可能性があるため、終了することがあります。コールバックでは、なぜ停止したのか、終了コードを知っておくと良いでしょう。
私はこれについてどうやって行けばいいのか分かりませんが、どんな助けもありがたいです(そして上記のコードの編集はもちろん歓迎です - 私はちょっとしたことです) 。私は
個人的には、 'Process'には何らかの' isFinished'ポーリングメソッドがありません。それは私が変更したいことの1つですが、didierdが提供するソリューションはあなたが望むもののように見えます。 –