scala调用python

本文介绍了在Scala项目中调用Python脚本的两种方法:通过启动本地进程执行Python脚本和利用JPython模块进行调用。前者适用于带有参数的情况且能使用Python环境中的第三方扩展包;后者虽能在JVM中执行Python代码,但可能不支持所有第三方扩展。

scala项目中调用python的几种方法

首先在工程目录某个地方建立了一个python文件
test.py

import sys

def addNum(a, b):
    return a + b

if __name__ == '__main__':
    a = 3
    b = 7

    # if args input
    if len(sys.argv) == 3:
        a = int(sys.argv[1])
        b = int(sys.argv[2])

    x = addNum(a, b)
    print x

    with open("src/test.txt", 'w') as f:
        f.write("the result: " + str(x))

方法1:启动进程执行python脚本

在scala里面启动一个本地进程,执行python程序

// method1: launch local runtime process to exec python file
// just exec file
val proc1 = Runtime.getRuntime().exec("python src/test.py")
proc1.waitFor()
// exec with parameters
val proc2 = Runtime.getRuntime().exec("python src/test.py 8 9")
proc2.waitFor()

其中:

  • 可以在命令行中带参数
  • 本地python环境中的第三方扩展包可以正常使用

方法2:用Jpython来调用

Jpython(http://www.jython.org/)是一个java的扩展包,在scala里面可以直接调用

首先将Jpyhon standaone的jar文件导入到scala工程并引用

import org.python.core.{PyFunction, PyInteger, PyObject}
import org.python.util.PythonInterpreter
// method2: use Jpython module
val interpreter = new PythonInterpreter()
// exec python code
interpreter.exec("print 'hello jpython'")
// exec python file in JVM
val py_file = new FileInputStream("src/test.py")
interpreter.execfile(py_file)
py_file.close()
// call python funtion and return result (oops: work in java but not in scala ~)
//        val a = 15
//        val b = 17
//        val func = interpreter.get("addNum", PyFunction.class).asInstanceOf[PyFunction]
//        val pyobj = func.__call__(new PyInteger(a), new PyInteger(b))
//        println(pyobj.toString())

其中:

  • 用Jpython理论上可以用三种方式调用python:执行语句,执行文件,调用函数,但是由于莫名其妙的原因,scala中call python的函数不能用
  • 用Jpython的方式无法使用python本地安装的第三方扩展包,因为Jpython运行在JVM上
  • 这种方式不建议使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值