39

私はScalascala.sys.processライブラリを使用しています。

で終了コードと!出力をキャプチャできることはわかっています!!が、両方をキャプチャしたい場合はどうすればよいでしょうか?

私はこの答えを見てきましたhttps://stackoverflow.com/a/6013932/416338有望に見えますが、1つのライナーがあり、何かが足りないのではないかと思っています。

4

7 に答える 7

30

コマンドを実行するための次のユーティリティメソッドがあります。

import sys.process._
def runCommand(cmd: Seq[String]): (Int, String, String) = {
  val stdoutStream = new ByteArrayOutputStream
  val stderrStream = new ByteArrayOutputStream
  val stdoutWriter = new PrintWriter(stdoutStream)
  val stderrWriter = new PrintWriter(stderrStream)
  val exitValue = cmd.!(ProcessLogger(stdoutWriter.println, stderrWriter.println))
  stdoutWriter.close()
  stderrWriter.close()
  (exitValue, stdoutStream.toString, stderrStream.toString)
}

ご覧のとおり、stdout、stderr、および結果コードをキャプチャします。

于 2013-03-15T17:22:10.490 に答える
19

使用できますProcessIO。Specs2 テストでは、入力に応じて終了値とプロセスの出力をチェックする必要がありましたstdin(inoutあり、タイプはString):

"the operation" should {
  f"return '$out' on input '$in'" in {
    var res = ""
    val io = new ProcessIO(
      stdin  => { stdin.write(in.getBytes)
                  stdin.close() }, 
      stdout => { res = convertStreamToString(stdout)
                  stdout.close() },
      stderr => { stderr.close() })
    val proc = f"$operation $file".run(io)
    proc.exitValue() must be_==(0)
    res must be_==(out)
  }
}

私はそれがあなたを助けるかもしれないと考えました. この例では、 から来るものは無視していstderrます。

于 2013-05-11T22:48:56.070 に答える
12

テキストをキャッチする出力ストリームを指定できます。

import sys.process._
val os   = new java.io.ByteArrayOutputStream
val code = ("volname" #> os).!
os.close()
val opt  = if (code == 0) Some(os.toString("UTF-8")) else None
于 2014-12-29T14:06:09.837 に答える
2

リンク内の「Alex Cruise」が提供する応答はかなり簡潔で、パフォーマンスが低下することはありません。

sys.process.ProcessLogger を拡張して、

var out = List[String]()
var err = List[String]()

内部的に、out.reverse および err.reverse の結果のゲッターを使用します。

于 2013-03-15T03:05:21.420 に答える