文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

Jython 是一个很棒的 Java 脚本引擎,使用很可靠的语法。事实上它非常使用用来编写一些维护或者监控脚本。

如果你和其他具备 Python 经验的团队协作,那么 Jython 可以很方便的在你的 Java 应用中集成  Python 代码。

首先,我们需要导入 Jython 解释器:

group 'com.gkatzioura'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile group: 'org.python', name: 'jython-standalone', version: '2.7.0'
}
第 1 段(可获 0.79 积分)

最简单的是直接执行类路径中的某个 Python 文件,例如有这么一个 Python 文件:hello_world.py

 print "Hello World" 

然后将这个文件作为解析流传递给解析器:

package com.gkatzioura;

import org.python.core.PyClass;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.core.PyObjectDerived;
import org.python.util.PythonInterpreter;

import java.io.InputStream;

/**
 * Created by gkatzioura on 19/10/2016.
 */
public class JythonCaller {

    private PythonInterpreter pythonInterpreter;

    public JythonCaller() {
        pythonInterpreter = new PythonInterpreter();
    }

    public void invokeScript(InputStream inputStream) {

        pythonInterpreter.execfile(inputStream);
    }

}
第 2 段(可获 0.44 积分)
@Test public void testInvokeScript() { 
    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("hello_world.py"); jythonCaller.invokeScript(inputStream); 
} 

下一步是创建一个 Python 类文件和另外一个 Python 文件导入类文件并对类进行实例化。

这个类文件假设为 divider.py.

class Divider:

    def divide(self,numerator,denominator):

        return numerator/denominator;

而导入 Divider 类的文件名为 classcaller.py

from divider import Divider

divider = Divider()

print divider.divide(10,5);
第 3 段(可获 0.53 积分)

接下来进行测试:

@Test
public void testInvokeClassCaller() {

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("classcaller.py");
    jythonCaller.invokeScript(inputStream);
} 

从这里例子中我们可以看到解析器已经成功的导入了 Python 源文件和响应的库包。

使用解析器运行 Python 源码文件是没问题的。不过我们还需要完全利用 Python 中实现的类和方法。

因此,接下来是创建一个 Python 类,并在 Java 中使用其定义的函数。

package com.gkatzioura;

import org.python.core.PyClass;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.core.PyObjectDerived;
import org.python.util.PythonInterpreter;

import java.io.InputStream;

/**
 * Created by gkatzioura on 19/10/2016.
 */
public class JythonCaller {

    private PythonInterpreter pythonInterpreter;

    public JythonCaller() {
        pythonInterpreter = new PythonInterpreter();
    }

    public void invokeClass() {

        pythonInterpreter.exec("from divider import Divider");
        PyClass dividerDef = (PyClass) pythonInterpreter.get("Divider");
        PyObject divider = dividerDef.__call__();
        PyObject pyObject = divider.invoke("divide",new PyInteger(20),new PyInteger(4));

        System.out.println(pyObject.toString());
    }

}

完整源码请访问 GitHub.

第 4 段(可获 0.83 积分)

文章评论