2017-03-16 3 views
1

ich in der Lage bin mit meinem Beispiel-Java-Programm in Python zu kommunizieren, sie durch mein Java-Programm zu öffnen und dann den folgenden Python-Code verwenden:py4j: wie der Java-Gateway von Python starten

from py4j.java_gateway import JavaGateway 
gg = JavaGateway() 
sw = gg.entry_point.getInstance() 
sw.run() 
... 

aber dies hat die Nachteil, dass ich das Java-Programm irgendwie öffnen muss, bevor ich diesen Code benutze.

Ich fand, dass es eine Methode namens launch_gateway gibt, die zu diesem Zweck sehr praktisch scheint.

Ich kann jedoch keine Verbindung zu meinem Java-Programm herstellen, wenn es auf diese Weise gestartet wird.

Ich habe versucht, den folgenden Code zu verwenden:

port = py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar") 
gp = GatewayParameters(port=port) 
gg = JavaGateway(gateway_parameters=gp) 
sw = gg.entry_point.getInstance() 

Aber ich erhalte den folgenden Fehler:

An error occurred while calling t.getInstance. Trace: 
py4j.Py4JException: Target Object ID does not exist for this gateway :t 

Ich glaube, ich bin etwas falsch in der Art und Weise tun, versuche ich, an das Gateway zu verbinden .

Irgendwelche Vorschläge?

Dank

Antwort

0

Barthelemy, Sie haben Recht! Ich habe zunächst falsch gedeutet, wie das funktioniert.

launch_gateway Läuft das Gateway in py4j.jar, das für die Interaktion mit einer Standard-JVM nützlich ist, aber offensichtlich keinen benutzerdefinierten Code enthält.

Wie Sie jedoch vorgeschlagen haben, können Sie mit dem Parameter classpath zusätzlichen benutzerdefinierten Java-Code laden.

Dies ist ein "minimales Beispiel":

from py4j.java_gateway import JavaGateway 
gg = JavaGateway.launch_gateway(classpath="/path/my_jar.jar") 

myclass_instance = gg.jvm.my_class_package_name.MyClass() 
result = myclass_instance.my_method() 

Beachten Sie, dass my_jar.jar kein Gateway starten muss.

launch_gateway gibt Ihnen nette Funktionen wie: die_on_exit, Stdout/Stdin Umleitung und automatische Portauswahl.

1

Ich sehe zwei mögliche Probleme:

  1. jarpath soll der Weg zum Py4J des jar sein. Sie können Ihre Bibliotheken im Klassenpfadargument von launch_gateway hinzufügen.
  2. Wenn Sie einen py4j.GatewayServer von launch_gateway beginnen, gibt es keine so in der Tat angegeben Eintrittspunkt, entry_point tun
Verwandte Themen