web-dev-qa-db-fra.com

Utilisation d'une bibliothèque Java de python

J'ai une application python et Java. L'application python génère une entrée pour Java app et l'invoque sur la ligne de commande.

Je suis sûr qu'il doit y avoir une solution plus élégante à cela; tout comme utiliser JNI pour appeler du code C à partir de Java.

Des pointeurs? (Pour info, je suis nouveau sur Python)

Clarification (au prix d'une longue question: excuses) L'application py (dont je ne suis pas propriétaire) accepte les commentaires des utilisateurs sous la forme d'un certain nombre de fichiers de configuration. Il les interprète ensuite et les fermes fonctionnent sur un certain nombre d'outils (cachés) via un mécanisme de plugin. Je cherche à ajouter un support pour les fonctionnalités fournies par l'héritage Java app.

Il n'est donc pas logique d'appeler l'application python à partir de l'application Java et je ne peux pas exécuter l'application py dans un environnement jython (sur le JVM).

Puisqu'il n'y a pas de mécanisme évident pour cela, je pense que l'invocation simple de CL est la meilleure solution.

31
Jim

Désolé de ressusciter le fil, mais aucune réponse n'a été acceptée ...

Vous pouvez également utiliser Py4J . Il y a un exemple sur la page d'accueil et beaucoup de documentation, mais essentiellement, vous appelez simplement Java méthodes de votre python comme si elles étaient python:

>>> from py4j.Java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> Java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = Java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.Java.lang.System.out.println('Hello World!') # call a static method

Contrairement à Jython, Py4J s'exécute dans le Python VM donc il est toujours "à jour" avec la dernière version de Python et vous pouvez utiliser des bibliothèques qui ne fonctionnent pas bien sur Jython (par exemple, lxml) .La communication se fait via des sockets au lieu de JNI.

Avertissement: je suis l'auteur de Py4J

58
Barthelemy

Jetez un oeil à Jython . C'est un peu comme JNI, mais remplacez C par Python, c'est-à-dire que vous pouvez appeler Python from Java et vice versa. Ce n'est pas totalement clair ce que vous essayez) à faire ou pourquoi votre approche actuelle n'est pas ce que vous voulez.

8
Dave Ray

Enveloppez votre Java-Code dans un conteneur (Servlet/EJB).

Vous ne perdez donc pas de temps dans le démarrage vm et vous vous dirigez vers des services plus orientés.

Pour l'habillage, vous pouvez utiliser jython (n'a de sens que si vous êtes familier avec python)

Choisissez un protocole de communication dans lequel python et Java peut utiliser:

  • json (voir www.json.org)
  • rmi (Python: JPype)
  • REST
  • SAVON (seulement pour les courageux)

Choisissez quelque chose que vous ou vos partenaires connaissez bien!

5
Blauohr

Si vous voulez vraiment intégrer votre application Java dans votre processus Python, jetez un œil à JPype . Il donne accès à = Java via JNI.

5
Stéphane Bonniez

Que diriez-vous d'utiliser swig: http://www.swig.org/Doc1.3/Java.html ?

4
user59634

Essayez JCC http://pypi.python.org/pypi/JCC/2.1

JCC est un générateur de code pour appeler Java directement depuis CPython. Il prend en charge CPython 2.3+, plusieurs JRE (Sun JDK 1.4+, Apple JRE 1.4+, et OpenJDK 1.7) sur OS X, Linux, Solaris et Windows.Il est produit par l'Open Source Application Foundation (OSAF, les créateurs de Chandler) et est publié sous une licence de type Apache.

De la description du package:

JCC est un générateur de code C++ pour produire le code de collage nécessaire pour appeler dans les classes Java de CPython via l'interface d'invocation native de Java (JNI).

JCC génère des classes wrapper C++ qui masquent également tous les détails sanglants de l'accès JNI Java gestion de la mémoire et des références d'objet).

JCC génère des types CPython qui rendent ces classes C++ accessibles à partir d'un interpréteur Python. JCC tente de rendre ces types Python types Pythonic en détectant les itérateurs et les accesseurs de propriété. Itérateurs et les mappages peuvent également être déclarés à JCC.

2
sstock