Un moyen simple d'appeler Java depuis Python

introduction

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.

environnement

OS X Yosemite 10.10.5 anaconda 3.5.0(python 3.5.2)

Installation

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/

la mise en oeuvre

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.

référence

https://www.py4j.org/ https://gist.github.com/bartdag/1070311

Recommended Posts

Un moyen simple d'appeler Java depuis Python
Appelez Matlab depuis Python pour optimiser
Un moyen simple de personnaliser l'importation Python
[Tutoriel Python] Une introduction facile à Python
[Python] Un moyen simple de visualiser les données énergétiques de manière interactive [plotly.express]
Un moyen simple d'utiliser Wikipedia avec Python
Un moyen simple d'accéder à l'API produit Amazon en Python
Un moyen simple d'utiliser Python 2.7 sur Cent OS 6
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Un moyen simple de vérifier la source des modules Python
Un moyen facile de gratter avec Python en utilisant Google Colab
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Appeler CPLEX depuis Python (DO cplex)
Publier de Python vers Slack
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
[Python] Une autre façon d'importer
Connectez-vous à sqlite depuis python
Un moyen simple de renommer des fichiers
Une introduction à la programmation Python
Un moyen simple de remplir le début de 0 en fonction du nombre de chiffres dans le nombre [Python]
Appeler des fonctions du langage C depuis Python pour échanger des tableaux multidimensionnels
Aller au langage pour voir et se souvenir de la partie 8 Appeler le langage GO à partir de Python
PyArmor ~ Un moyen facile de chiffrer et de fournir du code source Python ~
Comment appeler Python ou Julia à partir de Ruby (implémentation expérimentale)
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Appeler C depuis Python avec DragonFFI
Publication de Python sur la chronologie Facebook
Utiliser un écran connecté I2C à partir de Python
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Appeler popcount depuis Ruby / Python / C #
Python (de la première fois à l'exécution)
Publier une image de Python sur Tumblr
Appelez python de nim avec Nimpy
Python pour passer d'une autre langue
Python facile à apprendre en écrivant
Premiers pas avec Python pour les non-ingénieurs
Une alternative à `pause` en Python
Appeler des classes Java depuis CPython (Py4J)
Appeler C / C ++ depuis Python sur Mac
Appeler le langage C depuis Python (python.h)
N'a pas changé de Python 2 à 3
Mettre à jour Mac Python de 2 à 3
Un moyen facile d'arrondir après la virgule décimale en python3
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Un moyen simple de réexécuter une commande précédemment exécutée dans ipython
Appelez dlm depuis python pour exécuter un modèle de régression à coefficient variable dans le temps
Comment afficher les octets de la même manière en Java et Python
Pourquoi je suis passé de Java à Dart
Langage C pour voir et se souvenir de la partie 2 Appeler le langage C à partir de la chaîne Python (argument)
[Note] [PyTorch] De l'installation à la simplicité d'utilisation
python3 Comment installer un module externe
Comment mettre à jour Google Sheets à partir de Python
Comment convertir Python en fichier exe
Manuel Python privé (mis à jour de temps en temps)
Je veux utiliser jar de python