私はScalascala.sys.process
ライブラリを使用しています。
で終了コードと!
出力をキャプチャできることはわかっています!!
が、両方をキャプチャしたい場合はどうすればよいでしょうか?
私はこの答えを見てきましたhttps://stackoverflow.com/a/6013932/416338有望に見えますが、1つのライナーがあり、何かが足りないのではないかと思っています。
私はScalascala.sys.process
ライブラリを使用しています。
で終了コードと!
出力をキャプチャできることはわかっています!!
が、両方をキャプチャしたい場合はどうすればよいでしょうか?
私はこの答えを見てきましたhttps://stackoverflow.com/a/6013932/416338有望に見えますが、1つのライナーがあり、何かが足りないのではないかと思っています。
コマンドを実行するための次のユーティリティメソッドがあります。
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、および結果コードをキャプチャします。
使用できますProcessIO
。Specs2 テストでは、入力に応じて終了値とプロセスの出力をチェックする必要がありましたstdin
(in
でout
あり、タイプは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
ます。
テキストをキャッチする出力ストリームを指定できます。
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
リンク内の「Alex Cruise」が提供する応答はかなり簡潔で、パフォーマンスが低下することはありません。
sys.process.ProcessLogger を拡張して、
var out = List[String]()
var err = List[String]()
内部的に、out.reverse および err.reverse の結果のゲッターを使用します。