scala調用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上
  • 這種方式不建議使用
發佈了140 篇原創文章 · 獲贊 393 · 訪問量 111萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章