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处理程序,以便我可以在它完成之前终止它。
答案 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)