Llamar a Java desde Python
-
Llame a Java desde Python usando
Pyjnius
-
Llame a Java desde Python usando
Javabridge
-
Llame a Java desde Python usando
JPype
-
Llame a Java desde Python usando
Py4J
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:
-
Tener Java instalado, preferiblemente OpenJDK 11.
-
Tener
javac
instaladoapt-get install openjdk-11-jdk-headless
-
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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn