web-dev-qa-db-fra.com

Vous appelez Python en Java?

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?

100
Shahab

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);
89
Voo

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.

12
Peiming Hu

Plusieurs réponses indiquent que vous pouvez utiliser JNI ou JNA pour accéder à cpython, mais je ne recommanderais pas de recommencer à zéro, car il existe déjà des bibliothèques open source pour accéder à cpython à partir de Java. Par exemple:

9
bsteffen

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.

7
subes

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.

voir ici comment utiliser Python interpréteur en Java.

4
Anurag Uniyal

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.

4
Timo

Vous pouvez appeler n’importe quel langage de Java à l’aide de Java Native Interface

3
nidhin

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

2
alex