Ich habe kürzlich py4j entdeckt und konnte statische Java-Methoden von Python aufrufen. Jetzt möchte ich Python-Methoden von Java aufrufen. Ich konnte nicht viel Dokumentation finden, also ist dies der letzte Ort, an den ich denken kann, der mir sagen könnte, ob es möglich ist und wie.py4j - Wie würde ich beim Aufruf einer Python-Methode in Java gehen
Antwort
Sie können eine Python-Methode von Java unter implementing a Java interface on the python side aufrufen.
Die Schritte sind:
- eine Schnittstelle in Java erstellen, zB py4j.examples.Operator
- In Python, eine Klasse erstellen und innerhalb der Klasse, eine Java-Klasse mit einem "Arbeitsgeräte" erstellen Feld.
- In Python, ein Gateway mit start_callback_server = True, zum Beispiel instanziiert
gateway = JavaGateway(start_callback_server=True)
- In Python, instanziiert die Klasse einen Java-Schnittstelle implementiert und an der Java-Seite senden.
- Rufen Sie in Java die Schnittstelle auf.
Beispiel aus der Py4J Dokumentation angepasst:
Java-Code:
// File 1
package py4j.examples;
public interface Operator {
public int doOperation(int i, int j);
public int doOperation(int i, int j, int k);
}
// File 2
package py4j.examples;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import py4j.GatewayServer;
public class OperatorExample {
// To prevent integer overflow
private final static int MAX = 1000;
public List<Integer> randomBinaryOperator(Operator op) {
Random random = new Random();
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(random.nextInt(MAX));
numbers.add(random.nextInt(MAX));
numbers.add(op.doOperation(numbers.get(0), numbers.get(1)));
return numbers;
}
}
Python-Code:
from py4j.java_gateway import JavaGateway
class Addition(object):
def doOperation(self, i, j, k = None):
if k == None:
return i + j
else:
return i + j + k
class Java:
implements = ['py4j.examples.Operator']
if __name__ == '__main__':
gateway = JavaGateway(start_callback_server=True)
operator = Addition()
operator_example = gateway.jvm.py4j.examples.OperatorExample()
# "Sends" python object to the Java side.
numbers = operator_example.randomBinaryOperator(operator)
Großartiges Beispiel. Können Sie sagen, wie dies mit py4j erreicht werden kann? 0.8.2.1 – user3451476
Dies sollte wie in 0.8.2.1 funktionieren. – Barthelemy
können wir die Python-Funktion mit '.py'-Datei aufrufen, ohne das Python-Skript ändern zu müssen. Mit Jython PythonInterpreter können wir eine Funktion aufrufen, die in der Python-Datei definiert ist (http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html#utilizing-pythoninterpreter). Ist etwas ähnliches mit py4j möglich? – Mahesha999
Mögliche doppelte: http://stackoverflow.com/questions/14450173/send-a-python-objekt-zu-java-using-py4j? rq = 1 – Barthelemy