So rufen Sie eine Java-Methode aus Python mit py4j auf. Ich hatte es schwer mit all den alten japanischen Dokumenten, also habe ich sie zusammengefasst.
OS X Yosemite 10.10.5 anaconda 3.5.0(python 3.5.2)
Kopieren Sie nach der Installation von py4j mit pip das JAR, damit py4j auf der Java-Seite gelesen werden kann.
$ pip install py4j
$ sudo cp ~/.pyenv/versions/(Name der virtuellen Umgebung)/share/py4j/py4j(Ausführung).jar /Library/Java/Extensions/
Lassen Sie uns gemäß dem offiziellen Tutorial ein einfaches Beispiel erstellen, das in Java hinzugefügt wird. Erstellen Sie zunächst das folgende Java-Programm.
AdditionApplication.java
import py4j.GatewayServer;
public class AdditionApplication {
public int addition(int first, int second) {
return first + second;
}
public static void main(String[] args) {
AdditionApplication app = new AdditionApplication();
//App-Gateway.entry_Auf Punkt setzen
GatewayServer server = new GatewayServer(app);
server.start();
System.out.println("Gateway Server Started")
}
}
Starten Sie den Server nach dem Erstellen mit dem folgenden Befehl.
$ javac AdditionApplication.java
$ java AdditionApplication
Als nächstes schreiben wir ein Python-Programm, um AdditionApplication aufzurufen.
from py4j.java_gateway import JavaGateway
#Stellen Sie eine Verbindung zu JVM her
gateway = JavaGateway()
# java.util.Erstellen Sie eine zufällige Instanz
random = gateway.jvm.java.util.Random()
# Random.Rufen Sie nextInt an
number1 = random.nextInt(10)
number2 = random.nextInt(10)
print(number1,number2) # (2, 7)
#Rufen Sie eine Instanz von AdditionApplication ab
addition_app = gateway.entry_point
#Rufen Sie zusätzlich an
sum_num=addition_app.addition(number1,number2)
print(sum_num) # 9
Derzeit kann es von Python aus aufgerufen werden. Es ist jedoch etwas mühsam, den Server vom Terminal aus zu starten und zu stoppen. Wie auch immer, lassen Sie es uns von Anfang bis Ende in Python ausführen.
#Führen Sie dies aus, indem Sie den Klassenpfad angeben
args=(["java","-cp",'/path/to/class/','AdditionApplication'])
p=subprocess.Popen(args)
#Verhindern Sie, dass die Verarbeitung ausfällt, bevor Sie den Server starten
time.sleep(3)
gateway = JavaGateway(start_callback_server=True)
random = gateway.jvm.java.util.Random()
n1 = random.nextInt(10)
n2 = random.nextInt(10)
print(number1,number2) # (2, 7)
addition_app = gateway.entry_point
print(addition_app.addition(n1, n2)) # 9
#Töte den Prozess
gateway.shutdown()
Sie können es jetzt bis zum Ende konsistent mit Python ausführen. Es kann verwendet werden, wenn Sie ein Projekt einer Javer-Person erben, wenn Sie eine Java-Bibliothek verwenden möchten oder wenn Sie eine Verarbeitung implementieren möchten, die Geschwindigkeit in Java erfordert.
https://www.py4j.org/ https://gist.github.com/bartdag/1070311
Recommended Posts