Статьи

Вставить Jython для вас кодовой базы Java

Jython — отличный инструмент для некоторых быстрых java-скриптов, использующих довольно солидный синтаксис. На самом деле это прекрасно работает, когда дело доходит до реализации некоторых сценариев обслуживания или мониторинга с jmx для ваших java-приложений.

Если вы работаете с другими командами, имеющими опыт работы с Python, имеет смысл интегрировать Python с вашими Java-приложениями.

Сначала давайте импортируем интерпретатор jython, используя автономную версию.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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'
}

Так что самое простое, что нужно сделать, это просто выполнить файл python в нашем пути к классам. Файл будет hello_world.py

1
print "Hello World"

А затем передать файл в качестве входного потока в интерпретатор

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
    }
 
}
1
2
3
4
5
6
@Test
    public void testInvokeScript() {
 
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("hello_world.py");
        jythonCaller.invokeScript(inputStream);
    }

Следующим шагом является создание файла класса Python и еще одного файла Python, который будет импортировать файл класса и создать экземпляр класса.

Файл класса будет divr.py.

1
2
3
4
5
class Divider:
 
    def divide(self,numerator,denominator):
 
        return numerator/denominator;

И файл, импортирующий класс Divider, будет classcaller.py

1
2
3
4
5
from divider import Divider
 
divider = Divider()
 
print divider.divide(10,5);

Итак, давайте проверим это

1
2
3
4
5
6
@Test
    public void testInvokeClassCaller() {
 
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("classcaller.py");
        jythonCaller.invokeScript(inputStream);
    }

Из этого примера мы можем понять, что интерпретатор успешно импортирует файлы из пути к классам.

Запуск файлов с использованием интерпретатора — это нормально, однако нам нужно полностью использовать классы и функции, реализованные в python.
Поэтому следующим шагом является создание класса Python и использование его функций с использованием Java.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 .

Ссылка: Внедрите Jython в код java от нашего партнера JCG Эммануила Гкациоураса в блоге gkatzioura .