Scala中与派生进程的交互

Scala中与派生进程的交互,scala,process,Scala,Process,我可以使用Python控制gnuplot以交互方式打印绘图,如下所示: p = Popen(["/usr/local/bin/gnuplot"], shell=False, stdin=PIPE, stdout=PIPE) p.stdin.write(r'set terminal gif;') ... out, err = p.communicate() 我怎样才能用Scala做同样的事情?我有一些基本代码,但我不确定如何填补缺失的空白 val gnuplot = "/usr/local/bi

我可以使用Python控制
gnuplot
以交互方式打印绘图,如下所示:

p = Popen(["/usr/local/bin/gnuplot"], shell=False, stdin=PIPE, stdout=PIPE)
p.stdin.write(r'set terminal gif;')
...
out, err = p.communicate()
我怎样才能用Scala做同样的事情?我有一些基本代码,但我不确定如何填补缺失的空白

val gnuplot = "/usr/local/bin/gnuplot"
val pb = Process(gnuplot)
val pio = new ProcessIO(_ => (),
                        stdout => ...,
                        _ => ())
pb.run(pio)

此代码工作正常,获取
inputStream
,并使用流编写
gnuplot
命令:

  def plot(): Unit = {
    val inputStream = new SyncVar[OutputStream];
    val gnuplot = "/usr/local/bin/gnuplot"
    val pb = Process(gnuplot)
    val pio = new ProcessIO(stdin => inputStream.put(stdin),
      stdout => Source.fromInputStream(stdout).getLines.foreach(println),
      stderr => Source.fromInputStream(stderr).getLines.foreach(println));

    pb.run(pio)
    val a = Array("set terminal gif", "set output \"hello.gif\"", "plot [-3.14:3.14] sin(x)").foreach { s =>
      inputStream.get.write((s + "\n").getBytes)
    }
    inputStream.get.close()
  }

重新组合您的示例并非易事:

 def plot2(): Unit = {
    val done = new CountDownLatch(1)
    val cmds = List(
      "set terminal gif",
      """set output "hello2.gif"""",
      "plot [-3.14:3.14] sin(x)",
      "exit"
    )
    val gnuplot = "/usr/bin/gnuplot"
    val pb = Process(gnuplot)
    val pio = BasicIO standard { out =>
      for (c <- cmds) {
          Console println s">$c"
          out.write(s"$c\n".getBytes)
      }
      try out.close()
      finally done.countDown()
    }
    val p = pb run pio
    if (done.await(10, Seconds)) Console println s"Exited ${p.exitValue}"
    else {
      Console println "Stuck..."
      p.destroy()
    }
  }
def plot2():单位={
val done=新的倒计时锁存器(1)
val cmds=List(
“设置终端gif”,
“”“设置输出”hello2.gif”“,
“情节[-3.14:3.14]罪(x)”,
“退出”
)
val gnuplot=“/usr/bin/gnuplot”
val pb=进程(gnuplot)
val pio=BasicIO标准{out=>

谢谢,我有机会安装gnuplot并重新访问这个API,我必须每年重读一次。