Как вызвать метод python из класса java?
Я использую Jython в проекте Java.
у меня есть один Java-класс: myJavaClass.java
и один класс Python:myPythonClass.py
public class myJavaClass{
public String myMethod() {
PythonInterpreter interpreter = new PythonInterpreter();
//Code to write
}
}
файл Python выглядит следующим образом:
class myPythonClass:
def abc(self):
print "calling abc"
tmpb = {}
tmpb = {'status' : 'SUCCESS'}
return tmpb
теперь проблема в том, что я хочу позвонить abc()
метод моего файла Python из myMethod
метод моего Java-файла и печать результата.
4 ответов
если я читаю документы право, вы можете просто использовать eval
функция:
interpreter.execfile("/path/to/python_file.py");
PyDictionary result = interpreter.eval("myPythonClass().abc()");
или если вы хотите получить строку:
PyObject str = interpreter.eval("repr(myPythonClass().abc())");
System.out.println(str.toString());
если вы хотите предоставить ему некоторые входные данные из переменных Java, вы можете использовать set
прежде чем использовать имя переменной в коде Python:
interpreter.set("myvariable", Integer(21));
PyObject answer = interpreter.eval("'the answer is: %s' % (2*myvariable)");
System.out.println(answer.toString());
Если нам нужно запустить функцию python с параметрами и вернуть результаты, нам просто нужно распечатать это:
import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.util.PythonInterpreter;
public class method {
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("/pathtoyourmodule/somme_x_y.py");
PyObject str = interpreter.eval("repr(somme(4,5))");
System.out.println(str.toString());
}
somme-это функция в модуле python somme_x_y.py
def somme(x,y):
return x+y
нет никакого способа сделать именно это (что я знаю).
однако у вас есть несколько вариантов:
1) Выполните python из java следующим образом:
try {
String line;
Process p = Runtime.getRuntime().exec("cmd /c dir");
BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = bri.readLine()) != null) {
System.out.println(line);
}
bri.close();
while ((line = bre.readLine()) != null) {
System.out.println(line);
}
bre.close();
p.waitFor();
System.out.println("Done.");
}
catch (Exception err) {
err.printStackTrace();
}
2) Вы можете использовать языка Jython который является "реализацией языка программирования Python, написанного на Java", оттуда вам может повезти больше делать то, что вы хотите.
3) Вы можете заставить два приложения каким-то образом взаимодействовать с сокетом или общим файл
вы можете скачать тут Jython 2.7.0-Автономная Банка.
затем ...
- добавьте это в свой путь java в eclipse......
- в Проводнике пакетов (слева) щелкните правой кнопкой мыши проект Java и выберите Свойства.
- в treeview слева выберите путь сборки Java.
- выберите вкладку "библиотеки".
- Выберите Добавить Внешние Банки...
- перейдите к установке Jython (C:\jython2.5.2 для меня), и выберите jython.сосуд.
- Нажмите кнопку Применить и закрыть.
затем...
Java class (main) //use your won package name and python class dir
-----------------
package javaToPy;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
public class JPmain {
@SuppressWarnings("resource")
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
//set your python program/class dir here
interpreter.execfile
("C:\Users\aman0\Desktop\ME\Python\venv\PYsum.py");
PyObject str1 = interpreter.eval("repr(sum(10,50))");
System.out.println(str1.toString());
PyObject str2 = interpreter.eval("repr(multi(10,50))");
System.out.println(str2.toString());
interpreter.eval("repr(say())");
interpreter.eval("repr(saySomething('Hello brother'))");
}
}
---------------------------
Python class
------------
def sum(x,y):
return x+y
def multi(a,b):
return a*b
def say():
print("Hello from python")
def saySomething(word):
print(word)`enter code here`