Scala:运行外部命令,同时获取Process和stdout Stream [String]

时间:2014-12-12 06:49:03

标签: scala

Scala提供了一个执行命令并获取stdout流的函数:

var lines = Seq("somecommand") lines_! //This returns the stdout as Stream[String]

一个获取过程本身的功能

var process = Seq("somecommand") run  //This returns the process

但有没有办法获得两者,并将它们作为函数内的元组返回?我正在执行的外部命令有很长的运行时间,我使用Enumerator.enumerate(播放API)将stdout重定向到Enumerator。我还需要获取Process处理程序,以便我可以在它完成之前终止它。

2 个答案:

答案 0 :(得分:2)

您应该可以使用ProcessLogger直接将stdout重定向到您的Enumerator,如下所示:

 import scala.sys.process._

 val err = new StringBuilder 
 val enumerator = ...

 val proc = "<cmd>" run ProcessLogger(/* redirect stdout to enumerator */, 
                                      err append _)

 /* do something with proc */

只要有一行可用,ProcessLogger就会调用它的第一个参数,它是String => Unit类型的函数。

答案 1 :(得分:2)

这就是我最终做的事情:

var p = Promise[java.io.InputStream]
var seq = Seq("somecommand")
var proc = Process(seq)
var process = proc run new ProcessIO(
  _.close(),
  (input: java.io.InputStream) => {
    p.completeWith(Future.successful(input))
  },
  _.close()
)

var r = Await.result(p.future, 10 seconds)
Future{
  process.exitValue();
  //...do some clean up stuff...
}
(process, r)