如何开始" python.exe"作为scala中的子进程?

时间:2015-07-21 12:38:42

标签: python scala

我的要求是在scala和python之间形成一个集成。我如何开始" python.exe"并从scala执行python命令。

我已尝试过以下链接中的代码段,但它似乎无法正常工作。你能帮帮我吗?

How does the “scala.sys.process” from Scala 2.9 work?

提前致谢!

2 个答案:

答案 0 :(得分:1)

流程API非常人为,而且非常可怕(=没有)记录。我经常回到Java API,因为它对我来说更有意义。

这是一个例子。覆盖os变量以“存储”输出流似乎是一种愚蠢的方法(在Java中,您只需查询流程中的输出流)。也许API的设计者可以启发我们的想法。可能有更优雅的解决方案:

import sys.process._

var os: java.io.OutputStream = _
val python = Process(Seq("python","-i")).run(BasicIO.standard(os = _) /* WTF? */)

def pushLine(s: String): Unit = {
  os.write(s"$s\n".getBytes("UTF-8"))
  os.flush()
}

pushLine("1+1")
pushLine("exit()")

答案 1 :(得分:1)

我最近不得不承担一个非常类似的项目。我不需要只执行python脚本并解析输出,而是需要启动一些python代码并向其发送命令以执行和响应。在尝试通过STDIN / STDOUT进行此通信一段时间后,我选择使用ZeroMQ作为我的互操作通信通道

通过这样做,代码的执行变得像

一样简单
val process = s"python commandRunner.py $port".run()

其中$port是我的代码正在侦听python代码通过ZeroMQ连接回我的端口,而commandRunner脚本运行一个简单的ZeroMQ事件循环