Rufen Sie Java aus Python auf
-
Aufruf von Java aus Python mit
Pyjnius
-
Aufruf von Java aus Python mit
Javabridge
-
Aufruf von Java aus Python mit
JPype
-
Aufruf von Java aus Python mit
Py4J
In unserem vorherigen Artikel haben wir uns mit der Verwendung von Jython
befasst, um Java von Python aus aufzurufen, worüber Sie in diesem Link mehr lesen können.
Es gibt jedoch mehrere Möglichkeiten, Java von Python aus aufzurufen. Daher werden in diesem Artikel verschiedene Möglichkeiten zum Aufrufen von Java aus Python erörtert.
Aufruf von Java aus Python mit Pyjnius
Pyjnius
verwendet Reflektion, um Java-Klassen in der Python-Laufzeitumgebung bereitzustellen, und basiert auf der nativen Java-Schnittstelle.
Voraussetzungen:
-
Java installiert haben, vorzugsweise OpenJDK 11.
-
javac
installiert habenapt-get install openjdk-11-jdk-headless
-
Installieren Sie das Modul
pyjnius
pip install pyjnius==1.4.1
Unser Beispiel-Code-Snippet unten erstellt eine Referenz auf die Java-Klasse System
und ruft dann die Methode out.println static
mit dem Input Java in Python Success
auf.
from jnius import autoclass
autoclass("java.lang.System").out.println("Java in Python Success")
Lassen Sie uns dies mit dem folgenden Befehl ausführen.
python main.py
Ausgang:
Java in Python Success
Aufruf von Java aus Python mit Javabridge
Die Bibliothek Javabridge
lädt eine Java-Klasse org.cellprofiler.javabridge.CPython
, die wir verwenden können, um Python-Code auszuführen.
Wir können die Klasse in Java-Code verwenden, der vom Python-Interpreter aufgerufen wird, oder in Java, um in Java eingebettetes Python auszuführen.
Installieren Sie Javabridge
mit dem folgenden Befehl.
pip install javabridge
Es kann wünschenswert sein, Verweise auf Python-Objekte beizubehalten, während mehrere Skripts ausgeführt werden. Die folgenden Routinen ermöglichen beispielsweise einem Java-Aufrufer, auf einen Python-Wert (einen Basistyp oder ein Objekt) zu verweisen, indem er ein Token verwendet, das wir jederzeit gegen den tatsächlichen Wert austauschen können.
Der Java-Code verwaltet die Lebensdauer der Referenz.
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()
Aufruf von Java aus Python mit JPype
JPype
ist ein Python-Modul, das vollständigen Java-Zugriff von Python aus bietet. Diese Shared-Memory-basierte Lösung bietet Zugriff auf die gesamten CPython
- und Java-Bibliotheken und erreicht gleichzeitig eine gute Rechengeschwindigkeit.
Diese Methode ermöglicht auch die Verwendung von Java-Threading und Java-Schnittstellenimplementierung in Python sowie den direkten Speicherzugriff zwischen den beiden Maschinen.
Installieren Sie JPype
mit dem folgenden Befehl.
pip install jpype1
Nach der Installation können Sie nun mit dem Import des jpype
-Moduls beginnen.
import jpype as jp
jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM()
Aufruf von Java aus Python mit Py4J
Mit Py4J
kann von Python-Anwendungen, die in einem Python-Interpreter laufen, dynamisch auf Java-Objekte in einer Java Virtual Machine zugegriffen werden.
Die Methode wird aufgerufen, als ob die Java-Objekte im Python-Interpreter vorhanden wären, und auf Java-Sammlungen kann über standardmäßige Python-Sammlungsmethoden zugegriffen werden. Py4J
ermöglicht es Java-Programmen auch, Python-Objekte zurückzurufen.
Um Py4J
zu installieren, führen Sie das folgende Snippet aus.
pip install py4j
#or
easy_install py4j
Hier ist ein kurzer Ausschnitt, was Sie mit Py4J
machen können.
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!")
Im Gegensatz zu Jython
läuft ein Teil von Py4J
in der Python Virtual Machine (VM), hält sie ständig mit der neuesten Version von Python auf dem Laufenden und erlaubt Ihnen, Bibliotheken zu verwenden, die Jython
nicht richtig unterstützt (z. B. lxml
). Daher sollten Sie die Java-VM aufrufen, auf der der andere Teil ausgeführt wird.
Python kommuniziert über Sockets anstelle von JNI, und Py4J
hat sein Protokoll (um bestimmte Fälle zu optimieren, Speicher zu verwalten usw.).
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn