Utiliser Python depuis Java [dupliquer]
Possibilité De Dupliquer:
Java Python Integration
j'ai une grande base de code existante écrite en 100% Java, mais je voudrais utiliser Python pour quelques nouvelles sections. J'ai besoin de faire du traitement de texte et de langage, et je préférerais utiliser Python et une bibliothèque comme NLTK pour faire ça.
je suis au courant Jython project, mais il semble que cela représente une façon D'utiliser Java et ses bibliothèques depuis Python, plutôt que l'inverse - est-ce que je me trompe?
si ce n'est pas le cas, quelle serait la meilleure méthode d'interface entre Java et Python, de sorte que (idéalement) je puisse appeler une méthode en Python et avoir le résultat retourné en Java?
Merci.
7 réponses
je suis au courant du projet Jython, mais il semble que cela représente un moyen de utilisez Java et ses bibliothèques de L'intérieur Python, plutôt que de l'autre sens rond - suis-je en tort?
Oui, vous avez tort. Vous pouvez soit appeler un interpréteur en ligne de commande pour exécuter du code python en utilisant Jyton ou utiliser le code python de Java . Dans le passé il y avait aussi un python-à-compilateur Java, mais il a été abandonné avec Jython 2.2
j'écrirais un module Python pour gérer le traitement du texte et du langage, puis je construirais un petit pont en jython avec lequel votre programme java peut interagir. Le pont jython sera un pont très simple, qui n'est vraiment responsable que du transfert des appels vers le module python, et renvoie la réponse du module python vers le module java. Jython est vraiment facile à utiliser, et la configuration ne devrait pas vous prendre plus de 15 minutes.
bonne chance!
Je ne pense pas que vous pourriez utiliser NLTK de Jython, car il dépend de Numpy qui n'est pas porté à la JVM. Si vous avez besoin de NLTK ou de toute autre extension de CPython natif, vous pouvez envisager d'utiliser un mécanisme IPC pour communiquer entre CPython et la JVM. Cela étant dit, il existe un projet pour permettre d'appeler CPython depuis Java, appelé Jepp:
L'inverse (l'appel de code Java à partir de CPython) est le but de JPype et javaclass:
sourceforge.net/projects/jpype /
pypi.python.org/pypi/javaclass/0.1
Je n'ai jamais utilisé aucun de ces projets, donc je ne peux pas jurer pour leur qualité.
Jython est une implémentation Python tournant sur le JVM. Vous pouvez trouver des informations sur l'intégration de Python dans une application Java existante dans le "guide de l'utilisateur .
Je ne sais pas dans quel environnement vous travaillez, mais sachez que mélanger des langues dans la même application peut rapidement mener à un gâchis. Je recommande de créer des interfaces Java pour représenter les opérations que vous prévoyez d'utiliser, ainsi que des classes d'implémentation séparées qui enveloppent les Le code Python.
À mon avis, Jython est exactement ce que vous recherchez.
Il s'agit d'une implémentation de Python au sein de la JVM; en tant que telle, Vous pouvez librement échanger des objets et, par exemple, hériter d'une classe Java (avec certaines limitations).
notez que, son principal point de force (être au-dessus de de JVM) est aussi son principal inconvénient, car il ne peut pas utiliser toutes les extensions (C)Python écrites en C (ou dans tout autre langage compilé)); cela peut avoir un impact sur ce que vous êtes disposé à faire avec votre traitement de texte.
pour plus d'informations sur ce Qu'est le Jython, son potentiel et ses limites, je vous suggère de lire la FAQ Jython .
exécute simplement L'interpréteur Python comme un sous-processus depuis Java.
écrivez votre fonctionnalité Python comme un script approprié, qui lit à partir de stdin et écrit à stdout.
utilisez la classe Java Runtime
pour lancer un sous-processus qui exécute votre script Python. C'est très simple à faire et fournit une interface très propre.
modifier
import simplejson
import sys
for request in sys.stdin.readlines():
args = simplejson.loads( request )
result = myFunction( args['this'], args['that'] )
sys.stdout.writeline( simplejson.dumps( result ) + "\n" )
L'interface est simple, structurée et de très faible hauteur.
N'oubliez pas de vérifier d'abord auprès de ceux qui paient pour le développement qu'ils sont D'accord avec le codebase ayant besoin d'un développeur qui connaît à la fois Python et Java à partir de maintenant, et d'autres effets de coût et de maintenabilité que vous avez sans doute déjà pris en compte.
voir: http://www.acm.org/about/se-code 1.06, 2.03, 2.09, 4.03, 4.05, 6.07