Как вызвать метод 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-Автономная Банка.

затем ...

  1. добавьте это в свой путь java в eclipse......
  2. в Проводнике пакетов (слева) щелкните правой кнопкой мыши проект Java и выберите Свойства.
  3. в treeview слева выберите путь сборки Java.
  4. выберите вкладку "библиотеки".
  5. Выберите Добавить Внешние Банки...
  6. перейдите к установке Jython (C:\jython2.5.2 для меня), и выберите jython.сосуд.
  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`