¿Cómo llamar a un método python desde una clase java?

Estoy usando Jython dentro de un proyecto de Java.

Tengo una clase de Java: myJavaClass.java y una clase de Python: myPythonClass.py

 public class myJavaClass{ public String myMethod() { PythonInterpreter interpreter = new PythonInterpreter(); //Code to write } } 

El archivo de Python es el siguiente:

 class myPythonClass: def abc(self): print "calling abc" tmpb = {} tmpb = {'status' : 'SUCCESS'} return tmpb 

Ahora el problema es que quiero llamar al método abc() de mi archivo Python desde el método myMethod de mi archivo Java e imprimir el resultado.

Si leo los documentos correctamente, puedes usar la función eval :

 interpreter.execfile("/path/to/python_file.py"); PyDictionary result = interpreter.eval("myPythonClass().abc()"); 

O si quieres conseguir una cadena:

 PyObject str = interpreter.eval("repr(myPythonClass().abc())"); System.out.println(str.toString()); 

Si desea proporcionarle algo de entrada de las variables de Java, puede usar set antemano y luego usar ese nombre de variable dentro de su código de Python:

 interpreter.set("myvariable", Integer(21)); PyObject answer = interpreter.eval("'the answer is: %s' % (2*myvariable)"); System.out.println(answer.toString()); 

Si necesitamos ejecutar una función de python que tiene parámetros y devolver resultados, solo necesitamos imprimir esto:

 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 es la función en el módulo de python somme_x_y.py

 def somme(x,y): return x+y 

No hay ninguna manera de hacer exactamente eso (que yo sepa).

Sin embargo tienes algunas opciones:

1) Ejecuta el python desde java de esta manera:

 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) Tal vez puedas usar Jython, que es “una implementación del lenguaje de progtwigción Python escrito en Java”, ya que desde allí puedes tener más suerte haciendo lo que quieras.

3) Puede hacer que las dos aplicaciones se comuniquen de alguna manera, con un socket o un archivo compartido

Puede descargar aquí Jython 2.7.0 – Jarro independiente.

Entonces …

  1. agrega esto a tu ruta java en eclipse ……
  2. En el Explorador de paquetes (a la izquierda), haga clic con el botón derecho en su proyecto Java y seleccione Propiedades.
  3. En la vista de árbol de la izquierda, seleccione Java Build Path.
  4. Seleccione la pestaña Bibliotecas.
  5. Seleccione Agregar JAR externos …
  6. Busque la instalación de Jython (C: \ jython2.5.2 para mí) y seleccione jython.jar.
  7. Haga clic en Aplicar y cerrar.

Entonces…

 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`