Comment appeler une méthode java à partir de python en utilisant py4j. J'ai eu du mal avec tous les vieux documents japonais, alors je les ai résumés.
OS X Yosemite 10.10.5 anaconda 3.5.0(python 3.5.2)
Après avoir installé py4j avec pip, copiez le fichier jar pour que py4j puisse être lu du côté Java.
$ pip install py4j
$ sudo cp ~/.pyenv/versions/(Nom de l'environnement virtuel)/share/py4j/py4j(version).jar /Library/Java/Extensions/
Conformément au didacticiel officiel, créons un exemple simple qui ajoute en Java. Commencez par créer le programme Java suivant.
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();
//passerelle d'application.entry_Mettre au point
GatewayServer server = new GatewayServer(app);
server.start();
System.out.println("Gateway Server Started")
}
}
Après l'avoir créé, démarrez le serveur avec la commande suivante.
$ javac AdditionApplication.java
$ java AdditionApplication
Ensuite, écrivons un programme python pour appeler AdditionApplication.
from py4j.java_gateway import JavaGateway
#Connectez-vous à JVM
gateway = JavaGateway()
# java.util.Créer une instance aléatoire
random = gateway.jvm.java.util.Random()
# Random.Appeler nextInt
number1 = random.nextInt(10)
number2 = random.nextInt(10)
print(number1,number2) # (2, 7)
#Obtenir une instance d'AdditionApplication
addition_app = gateway.entry_point
#Ajout d'appel
sum_num=addition_app.addition(number1,number2)
print(sum_num) # 9
Pour le moment, il peut être appelé depuis python. Cependant, il est un peu gênant de démarrer et d'arrêter le serveur à partir du terminal. Quoi qu'il en soit, exécutons-le en python du début à la fin.
#Exécuter en spécifiant le chemin de classe
args=(["java","-cp",'/path/to/class/','AdditionApplication'])
p=subprocess.Popen(args)
#Empêcher le traitement de s'arrêter avant de démarrer le serveur
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
#Tuez le processus
gateway.shutdown()
Vous pouvez maintenant l'exécuter de manière cohérente avec python jusqu'à la fin. Il peut être utilisé lors de l'héritage d'un projet d'une personne Javer, lorsqu'une bibliothèque Java que vous souhaitez utiliser ou lorsque vous souhaitez implémenter un traitement nécessitant de la vitesse en Java.
https://www.py4j.org/ https://gist.github.com/bartdag/1070311