Je me demande s’il est possible d’appeler jython des fonctions python à partir de code Java, ou s’agit-il uniquement d’appeler le code Java à partir de python?
Jython: Python pour la plate-forme Java - http://www.jython.org/index.html
Vous pouvez facilement appeler les fonctions python à partir du code Java avec Jython. C’est aussi longtemps que votre code python s’exécute sous jython, c’est-à-dire qu’il n’utilise pas d’extensions c qui ne sont pas prises en charge.
Si cela fonctionne pour vous, c'est certainement la solution la plus simple. Sinon, vous pouvez utiliser org.python.util.PythonInterpreter
à partir du nouveau support de l'interpréteur Java6.
Un exemple simple, mais qui devrait marcher, je l’espère: (aucune vérification d’erreur effectuée pour des raisons de brièveté)
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModules if they are not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);
Ce n'est pas malin d'avoir du code python en Java. Enveloppez votre code python avec flask ou un autre framework Web pour en faire un microservice. Faites en sorte que votre programme Java puisse appeler ce microservice (par exemple, via REST).
Croyez-moi, ceci est très simple et vous évitera des tonnes de problèmes. Et les codes sont faiblement couplés, de sorte qu'ils sont évolutifs.
Voici une bibliothèque qui vous permet d'écrire vos scripts python une fois et de choisir la méthode d'intégration (Jython, CPython/PyPy via Jep et Py4j) à utiliser à l'exécution:
https://github.com/subes/invesdwin-context-python
Comme chaque méthode a ses propres avantages/inconvénients, comme expliqué dans le lien.
Cela dépend de ce que vous entendez par python fonctions? si elles ont été écrites en cpython vous ne pouvez pas les appeler directement, vous devrez utiliser JNI , mais si elles ont été écrites en Jython vous peut facilement les appeler depuis Java, car jython génère finalement le code Java.
Maintenant, quand je dis écrit en cpython ou jython, cela n'a pas beaucoup de sens car python est python et la plupart du code s'exécutera sur les deux implémentations sauf si vous utilisez des bibliothèques spécifiques reposant sur cpython ou Java.
Selon vos besoins, des options telles que XML-RPC peuvent s'avérer utiles, car elles peuvent être utilisées pour appeler à distance des fonctions à distance, dans n'importe quel langage prenant en charge le protocole.
Vous pouvez appeler n’importe quel langage de Java à l’aide de Java Native Interface
Jython a quelques limitations:
Il y a un certain nombre de différences. Premièrement, les programmes Jython ne peuvent pas utiliser les modules d'extension CPython écrits en C. Ces modules ont généralement des fichiers portant l'extension .so, .pyd ou .dll. Si vous souhaitez utiliser un tel module, vous devez rechercher un équivalent écrit en pure Python ou en Java. Bien qu’il soit techniquement possible de prendre en charge de telles extensions (mais IronPython le fait), il n’est pas prévu de le faire dans Jython.
Distribution de mes scripts Python sous forme de fichiers JAR avec Jython?
vous pouvez simplement appeler python scripts (ou des scripts bash ou Perl) à partir de Java à l'aide de Runtime ou ProcessBuilder et transmettre le résultat à Java:
Exécution d'un script shell bash en Java
ligne de commande en cours d'exécution en Java
Java runtime.getruntime () obtient le résultat de l'exécution d'un programme en ligne de commande