Appeler des classes Java depuis CPython (Py4J)

Il existe les méthodes suivantes pour appeler et utiliser des bibliothèques Java à partir de Python.

Jython

http://www.jython.org/

Puisque l'interpréteur lui-même est implémenté en Java, dans un script Python Vous pouvez utiliser les classes Java et les bibliothèques standard telles quelles. C'est le plus rapide, mais la compatibilité avec CPython compte. (Certaines bibliothèques standard CPython ne le prennent pas en charge, etc.)

Apprenez à appeler un fichier jar en Jython http://qiita.com/mojaie/items/9add34871a43c4181af7

JPype

http://jpype.sourceforge.net/

Appelez des classes Java depuis Python via JNI, qui intègre C et Java. Vous pouvez appeler Java en douceur depuis CPython, mais le processus d'installation est très gênant. (Il peut même ne pas être possible d'installer en fonction de la compatibilité des modules dépendants tels que le compilateur C)

Py4J

http://py4j.sourceforge.net/

Démarrez le serveur sur la machine virtuelle Java et liez CPython et Java par communication socket. C'est plus lent que la méthode ci-dessus, mais comme Java et Python sont complètement indépendants, L'environnement peut être construit relativement facilement et l'emballage est facile.

Cette fois, je vais vous présenter comment appeler un fichier jar en utilisant Py4J.

Installation

pip install py4j

Si vous n'avez pas installé python ou java, veuillez l'installer. Puisque le dossier d'installation (dossier de partage?) Contient un fichier appelé py4j0.7.jar, Copiez-le dans un emplacement approprié et placez-le dans CLASSPATH de Java.

Création d'un programme serveur Java

Tout d'abord, créez une classe de serveur pour appeler la classe java existante. Voici une méthode pour appeler une méthode appelée getString dans une classe appelée JClass. Ceci est un exemple de la classe JClassEntryPoint.

JClassEntryPoint.java



import py4j.GatewayServer;

public class JClassEntryPoint {

	private JClass jclass = null;

	public JClassEntryPoint() {
		this.jclass = new JClass();
	}
	
	public String getString(String str) {
		return jclass.getString();
	}

	public static void main(String[] args) {
		GatewayServer gatewayServer = new GatewayServer(new JClassEntryPoint());
		gatewayServer.start();
	}
}

class JClass {

	private String str = "hogehoge";

	public String getString(String str) {
		return this.str;
	}
}

Faites de JClassEntryPoint.java un fichier jar exécutable.

Créer un script Python appelant

Tout d'abord, utilisez le sous-processus pour exécuter le fichier jar ci-dessus. Le serveur démarrera et vous pourrez charger les classes Java via Java Gateway. Aussi, en utilisant atexit.register (), à la fin du script Python Vous pouvez arrêter le serveur automatiquement. time.sleep (2) empêche Java Gateway d'essayer de communiquer avec le serveur avant son démarrage. C'est une mesure minutieuse pour l'empêcher. Je pense qu'il existe un meilleur moyen.

jclassclient.py



import atexit
import subprocess
import time
from py4j.java_gateway import JavaGateway


class JClassClient(object):

    def __init__(self):
        self._gateway = None
        self._process = None
        cmd = ["java", "-jar", "/path/to/jarfile/JClassEntryPoint.jar", "JClassEntryPoint"]
        self._process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
        print "jvmprocess started: " + str(self._process.pid)
        atexit.register(self._process.kill)
        time.sleep(2)
        self._gateway = JavaGateway()

    def getString(self):
        return self._gateway.entry_point.getString()


def main():
    client = JClassClient()
    print client.getString()

if __name__ == "__main__":
    main()

Recommended Posts

Appeler des classes Java depuis CPython (Py4J)
Un moyen simple d'appeler Java depuis Python
Appeler CPLEX depuis Python (DO cplex)