Llamar a Java desde Python

Marion Paul Kenneth Mendoza 10 octubre 2023
  1. Llame a Java desde Python usando Pyjnius
  2. Llame a Java desde Python usando Javabridge
  3. Llame a Java desde Python usando JPype
  4. Llame a Java desde Python usando Py4J
Llamar a Java desde Python

En nuestro artículo anterior, abordamos cómo usar Jython para llamar a Java desde Python, que puede leer más en este enlace.

Sin embargo, hay varias formas de llamar a Java desde Python. Por lo tanto, este artículo discutirá varias formas de llamar a Java desde Python.

Llame a Java desde Python usando Pyjnius

Pyjnius utiliza la reflexión para proporcionar clases de Java en el tiempo de ejecución de Python y se basa en la interfaz nativa de Java.

requisitos previos:

  1. Tener Java instalado, preferiblemente OpenJDK 11.

  2. Tener javac instalado

    apt-get install openjdk-11-jdk-headless
    
  3. Instala el módulo pyjnius

    pip install pyjnius==1.4.1
    

Nuestro fragmento de código de ejemplo a continuación crea una referencia a la clase Java Sistema y luego llama al método out.println static con la entrada Java en Python Success.

from jnius import autoclass

autoclass("java.lang.System").out.println("Java in Python Success")

Ejecutemos esto usando el siguiente comando.

python main.py

Producción :

Java in Python Success

Llame a Java desde Python usando Javabridge

La biblioteca Javabridge carga una clase Java, org.cellprofiler.javabridge.CPython, que podemos usar para ejecutar código Python.

Podemos usar la clase dentro del código Java llamado desde el intérprete de Python o dentro de Java para ejecutar Python incrustado en Java.

Instale Javabridge con el siguiente comando.

pip install javabridge

Puede ser conveniente mantener las referencias a los objetos de Python mientras se ejecutan varios scripts. Las siguientes rutinas, por ejemplo, permiten que una persona que llama Java se refiera a un valor de Python (un tipo base o un objeto) usando un token que podemos intercambiar en cualquier momento por el valor real.

El código Java gestiona la vida útil de la referencia.

import os
import javabridge

javaclasspath = (
    [
        os.path.realpath(
            os.path.join(os.path.dirname(__file__), "..", "build", "classes")
        )
    ]
    + [os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "cfg"))]
    + [
        os.path.realpath(
            os.path.join(os.path.dirname(__file__), "..", "lib", name + ".jar")
        )
        for name in ["hamcrest-core-1.1", "logback-core-0.9.28", "slf4j-api-1.6.1"]
    ]
    + javabridge.JARS
)

javabridge.start_vm(class_path=[os.pathsep.join(javaclasspath)], run_headless=True)
try:
    print
    javabridge.run_script(
        'java.lang.String.format("Hello, %s!", greetee);', dict(greetee="world")
    )
finally:
    javabridge.kill_vm()

Llame a Java desde Python usando JPype

JPype es un módulo de Python que ofrece acceso completo a Java desde Python. Esta solución basada en memoria compartida brinda acceso a todas las bibliotecas CPython y Java al mismo tiempo que logra una buena velocidad de cálculo.

Este método también permite el uso de subprocesos de Java y la implementación de la interfaz de Java en Python, así como el acceso directo a la memoria entre las dos máquinas.

Instala JPype con el siguiente comando.

pip install jpype1

Una vez instalado, ya puedes empezar a importar el módulo jpype.

import jpype as jp

jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM()

Llame a Java desde Python usando Py4J

Con Py4J, las aplicaciones de Python que se ejecutan en un intérprete de Python pueden acceder dinámicamente a los objetos de Java en una máquina virtual de Java.

El método se invoca como si los objetos de Java estuvieran presentes en el intérprete de Python, y las colecciones de Java son accesibles a través de métodos de colección estándar de Python. Py4J también hace posible que los programas de Java devuelvan la llamada a los objetos de Python.

Para instalar Py4J, ejecute el siguiente fragmento.

pip install py4j
#or
easy_install py4j

Aquí hay un breve fragmento de lo que puede hacer con Py4J.

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!")

A diferencia de Jython, una parte de Py4J se ejecuta en Python Virtual Machine (VM), manteniéndola actualizada constantemente con la última versión de Python y permitiéndole usar bibliotecas que Jython no admite correctamente (por ejemplo, lxml). Por lo tanto, debe llamar a la VM de Java donde se ejecuta la otra parte.

Python se comunica a través de sockets en lugar de JNI, y Py4J tiene su protocolo (para optimizar ciertos casos, administrar memoria, etc.).

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn