una retorno metodos llamar funciones funcion ejemplos java python function language-interoperability

llamar - metodos sin retorno java



¿Cómo llamar a objetos y funciones de Java desde CPython? (6)

Tengo un programa de Python, que se ejecuta en la implementación de CPython, y dentro de él debo llamar a una función definida en un programa de Java. ¿Cómo puedo hacer esto?

Sería bueno poder usar algunos objetos de Java también.

Jython no es una opción. Debo ejecutar la parte de python en CPython.


Lo más fácil de hacer es

  1. Escriba una CLI trivial para su "función" java. (No existe tal cosa, así que supongo que realmente se refiere a una función de método de una clase Java).

    public class ExposeAMethod { public static void main( String args[] ) { TheClassToExpose x = new TheClassToExpose(); x.theFunction(); } }

  2. Compile y cree un archivo JAR ejecutable con esto como punto de entrada. Llámalo ExposeAMethod.jar

  3. Llamar esto desde un comando creado por subproceso.

    import subprocess p = subprocess.Popen("java -jar ExposeAMethod.jar", shell=True) sts = os.waitpid(p.pid, 0)

Este es el mínimo. Y realmente no es mucho. Cuento 6 líneas de java, 3 líneas de Python y ya está funcionando.

Si desea pasar argumentos a este constructor de clase Java o función de método, tendrá que escribir algunas líneas más de código. Tienes dos opciones.

  • Lea los argumentos de stdin, escriba los resultados en stdout. Esto es relativamente fácil y funciona muy bien.

  • Analice los argumentos como opciones de línea de comandos para Java, escriba los resultados en stdout. Esto es un poco más difícil, pero se generaliza muy bien. La ventaja es que ahora tiene un útil programa de línea de comandos Java que puede reutilizar.


No sé para Python, la última vez que tuve que llamar a Java desde la aplicación C (servicio NT) tuve que cargar jvm.dll. Eche un vistazo a la documentación de JNI.

Además, llame siempre a os.system ("java com.myapp.MyClass") si no está preocupado por el rendimiento.



Disculpas por resucitar el hilo, pero creo que tengo una respuesta mejor :-)

También podría usar Py4J, que tiene dos partes: una biblioteca que se ejecuta en CPython (o cualquier intérprete de Python para el caso) y una biblioteca que se ejecuta en la máquina virtual Java a la que desea llamar.

Hay un ejemplo en la página principal y mucha documentación, pero esencialmente, simplemente llama a los métodos Java desde su código python como si fueran métodos de Python:

>>> from py4j.java_gateway import JavaGateway >>> gateway = JavaGateway() # connect to the JVM >>> java_object = gateway.jvm.mypackage.MyClass() # invoke constructor >>> other_object = java_object.doThat() >>> other_object.doThis(1,''abc'') >>> gateway.jvm.java.lang.System.out.println(''Hello World!'') # call a static method

La comunicación se realiza a través de sockets en lugar de JNI.

Descargo de responsabilidad: soy el autor de Py4J


Mira nuestro proyecto python-javabridge . Es un contenedor de Python alrededor del JNI, muy usado por CellProfiler . Ofrece acceso de bajo nivel al JNI y un acceso de alto nivel basado en la reflexión a objetos Java.


Si no quiere ir, escriba su propia ruta JNI / C.

La otra opción es usar jpype, que para mí siempre es lo que uso para acceder a las bases de datos de Oracle, ya que la instalación de los controladores oracle c en una PC es una pita. Puede hacer cosas como (desde documentos):

from jpype import * startJVM("d:/tools/j2sdk/jre/bin/client/jvm.dll", "-ea") # or path to your jvm java.lang.System.out.println("hello world") shutdownJVM()

No se ha actualizado desde hace un tiempo y no hay mucho en el camino de la documentación, pero funciona razonablemente bien.