web-dev-qa-db-fra.com

Utilisation de Python de l'intérieur Java

Duplicata possible:
Java Python

J'ai une grande base de code existante écrite en 100% Java, mais je voudrais utiliser Python pour quelques nouvelles sections de celui-ci. J'ai besoin de faire du traitement de texte et de langue, et j'aurais beaucoup utilisez plutôt Python et une bibliothèque comme NLTK pour ce faire.

Je connais le projet Jython, mais il semble que cela représente un moyen d'utiliser Java et ses bibliothèques à partir de Python, plutôt que l'inverse - je me trompe à ce sujet?

Sinon, quelle serait la meilleure méthode pour interfacer entre Java et Python, de telle sorte que (idéalement) je puisse appeler une méthode dans Python et avoir le résultat) retourné à Java?

Merci.

57
Liam

Je connais le projet Jython, mais il semble que cela représente un moyen d'utiliser Java et ses bibliothèques à partir de Python, plutôt que l'inverse - je me trompe à ce sujet?

Oui, tu as tort. Vous pouvez soit appeler un interpréteur de ligne de commande pour exécuter python utilisant Jyton ou tiliser python de Java . Dans le passé, il y avait aussi un compilateur python vers Java, mais il a été abandonné avec Jython 2.2

35
Michael Borgwardt

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 pourrait interagir. Le pont jython sera très simple, il est vraiment uniquement responsable du transfert des appels vers le module python et retourne la réponse du module python au Java module. Jython est vraiment facile à utiliser et la configuration ne devrait pas vous prendre plus de 15 minutes.

Bonne chance!

6
Mia Clarke

Je ne pense pas que vous pourriez utiliser NLTK de Jython, car cela dépend de Numpy qui n'est pas porté sur la JVM. Si vous avez besoin de NLTK ou de toute autre extension CPython native, vous pourriez 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 à partir de Java, appelé Jepp:

http://jepp.sourceforge.net/

L'inverse (appel Java de CPython) est l'objectif 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 vouer pour leur qualité.

4
Carlos Santos

Jython est une implémentation Python exécutée sur la machine virtuelle Java. Vous pouvez trouver des informations sur l'intégration Python dans une application Java Java existante dans le guide de l'utilisateur .

Je ne connais pas l'environnement dans lequel vous travaillez, mais sachez que le mélange des langues dans la même application peut rapidement entraîner des dégâts. 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 emballées séparément qui enveloppent le code Python.

2
kdgregory

À mon avis, Jython est exactement ce que vous regardez.
Il s'agit d'une implémentation de Python dans la JVM; en tant que tel, vous pouvez librement échanger des objets et, par exemple, héritent d'une classe Java (avec certaines limitations).

Notez que son point fort (être au-dessus de JVM) est également son inconvénient majeur, 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 prêt à faire avec votre traitement de texte.

Pour plus d'informations sur ce qu'est Jython, son potentiel et ses limites, je vous suggère de lire le FAQ Jython .

2
rob

Exécutez simplement l'interpréteur Python en tant que sous-processus à partir de Java.

Écrivez votre fonctionnalité Python comme un script approprié, qui lit depuis stdin et écrit dans stdout.

Utilisez la classe Java Runtime pour générer un sous-processus qui exécute votre script Python. Ceci 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 très peu lourde.

0
S.Lott

N'oubliez pas de vérifier d'abord auprès de ceux qui paient pour le développement qu'ils sont OK avec la base de code ayant besoin d'un développeur qui connaît les deux 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

0
Mikael Gueck