Rufen Sie Java-Klassen von CPython (Py4J) auf.

Es gibt die folgenden Methoden, um Java-Bibliotheken aus Python aufzurufen und zu verwenden.

Jython

http://www.jython.org/

Da der Interpreter selbst in Java implementiert ist, in einem Python-Skript Sie können Java-Klassen und Standardbibliotheken unverändert verwenden. Es ist das schnellste, aber die Kompatibilität mit CPython ist wichtig. (Einige CPython-Standardbibliotheken unterstützen dies nicht usw.)

Erfahren Sie, wie Sie eine JAR-Datei in Jython aufrufen http://qiita.com/mojaie/items/9add34871a43c4181af7

JPype

http://jpype.sourceforge.net/

Rufen Sie Java-Klassen von Python über JNI auf, das C und Java integriert. Sie können Java problemlos von CPython aus aufrufen, der Installationsvorgang ist jedoch sehr mühsam. (Abhängig von der Kompatibilität abhängiger Module wie des C-Compilers ist die Installation möglicherweise nicht möglich.)

Py4J

http://py4j.sourceforge.net/

Starten Sie den Server auf der Java Virtual Machine und verbinden Sie CPython und Java über die Socket-Kommunikation. Es ist langsamer als die obige Methode, aber weil Java und Python völlig unabhängig sind, Die Umgebung kann relativ einfach aufgebaut werden und die Verpackung ist einfach.

Dieses Mal werde ich vorstellen, wie man eine JAR-Datei mit Py4J aufruft.

Installation

pip install py4j

Wenn Sie Python oder Java nicht installiert haben, installieren Sie es bitte. Da der Installationsordner (Freigabeordner?) Eine Datei mit dem Namen py4j0.7.jar enthält, Kopieren Sie es an einen geeigneten Ort und legen Sie es in Javas CLASSPATH ab.

Erstellen eines Java-Serverprogramms

Erstellen Sie zunächst eine Serverklasse, um die vorhandene Java-Klasse aufzurufen. Unten finden Sie eine Methode zum Aufrufen einer Methode namens getString in einer Klasse namens JClass. Dies ist ein Beispiel für die JClassEntryPoint-Klasse.

JClassEntryPoint.java



import py4j.GatewayServer;

public class JClassEntryPoint {

	private JClass jclass = null;

	public JClassEntryPoint() {
		this.jclass = new JClass();
	}
	
	public String getString(String str) {
		return jclass.getString();
	}

	public static void main(String[] args) {
		GatewayServer gatewayServer = new GatewayServer(new JClassEntryPoint());
		gatewayServer.start();
	}
}

class JClass {

	private String str = "hogehoge";

	public String getString(String str) {
		return this.str;
	}
}

Machen Sie JClassEntryPoint.java zu einer ausführbaren JAR-Datei.

Erstellen eines aufrufenden Python-Skripts

Verwenden Sie zunächst den Unterprozess, um die obige JAR-Datei auszuführen. Der Server wird gestartet und Sie können Java-Klassen über Java Gateway laden. Verwenden Sie außerdem atexit.register () am Ende des Python-Skripts Sie können den Server automatisch herunterfahren. time.sleep (2) verhindert, dass Java Gateway vor dem Start versucht, mit dem Server zu kommunizieren. Es ist eine sorgfältige Maßnahme, um dies zu verhindern. Ich denke, es gibt einen besseren Weg.

jclassclient.py



import atexit
import subprocess
import time
from py4j.java_gateway import JavaGateway


class JClassClient(object):

    def __init__(self):
        self._gateway = None
        self._process = None
        cmd = ["java", "-jar", "/path/to/jarfile/JClassEntryPoint.jar", "JClassEntryPoint"]
        self._process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
        print "jvmprocess started: " + str(self._process.pid)
        atexit.register(self._process.kill)
        time.sleep(2)
        self._gateway = JavaGateway()

    def getString(self):
        return self._gateway.entry_point.getString()


def main():
    client = JClassClient()
    print client.getString()

if __name__ == "__main__":
    main()

Recommended Posts

Rufen Sie Java-Klassen von CPython (Py4J) auf.
Eine einfache Möglichkeit, Java von Python aus aufzurufen
Rufen Sie CPLEX von Python aus auf (DO cplex)