Как вызвать метод Python из класса Java? - PullRequest
8 голосов
/ 21 февраля 2012

Я использую 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 ]

13 голосов
/ 21 февраля 2012

Если я прочитал документы справа, вы можете просто использовать функцию 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());
3 голосов
/ 14 декабря 2014

Если нам нужно запустить функцию 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 голос
/ 21 февраля 2012

Нет никакого способа сделать именно это (о чем я знаю).

Однако у вас есть несколько вариантов:

1) Выполнить питона изнутри 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) Вы можете заставить два приложения взаимодействовать друг с другом, используя сокет или общий файл

0 голосов
/ 06 января 2018

Вы можете скачать здесь Jython 2.7.0 - Автономный Jar.

Затем ...

  1. добавить это к вашему пути Java в Eclipse ......
  2. В проводнике пакетов (слева) щелкните правой кнопкой мыши свой проект Java и выберите «Свойства».
  3. В древовидном представлении слева выберите «Путь сборки Java».
  4. Выберите вкладку «Библиотеки».
  5. Выберите «Добавить внешние JAR-файлы ...» *
  6. Перейдите к установке Jython (для меня C: \ jython2.5.2) и выберите jython.jar.
  7. Нажмите «Применить» и закройте.

Затем ...

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`
...