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.5repositories { 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 Dividerdivider = 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 . |