Rufen Sie Java aus Python auf

Marion Paul Kenneth Mendoza 10 Oktober 2023
  1. Aufruf von Java aus Python mit Pyjnius
  2. Aufruf von Java aus Python mit Javabridge
  3. Aufruf von Java aus Python mit JPype
  4. Aufruf von Java aus Python mit Py4J
Rufen Sie Java aus Python auf

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:

  1. Java installiert haben, vorzugsweise OpenJDK 11.

  2. javac installiert haben

    apt-get install openjdk-11-jdk-headless
    
  3. 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 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