Scala中与派生进程的交互
我可以使用Python控制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
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,我必须每年重读一次。