scala调用python

发布时间:2019-09-06 08:53:45编辑:auto阅读(2235)

    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上
    • 这种方式不建议使用

关键字

上一篇: Python创建界面程序

下一篇: Python的定时器