Java Python Intégration
J'ai une application Java qui doit s'intégrer à une 3ème partie de la bibliothèque. La bibliothèque est écrite en Python, et je n'ai pas de mot à dire sur qui. Je suis à essayer de comprendre la meilleure façon d'intégrer avec elle. Je suis en train de sortir du PCPC (Java, Python Intégré) - quelqu'un a utilisé qu'avant? Mon autre idée consiste à utiliser JNI pour communiquer avec les liaisons C pour Python.
Des idées sur la meilleure façon de le faire serait appréciée. Merci.
- Si la bibliothèque python est écrit en pur python, que sur l'utilisation de Python ?
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas utiliser Jython? Le seul inconvénient que je peut immédiatement penser, c'est si votre bibliothèque utilise Disponible extensions natives.
EDIT: Si vous pouvez utiliser Jython maintenant mais pensez que vous pourriez avoir des problèmes avec une version ultérieure de la bibliothèque, je vous suggère d'essayer d'isoler la bibliothèque de votre application (par exemple, une sorte de carte d'interface). Aller avec la chose la plus simple qui fonctionne pour le moment, puis envisager de JNI/Disponible/etc si et quand vous en avez besoin. Il y a peu à gagner en allant la (douloureuse) JNI route sauf si vous devez vraiment.
Franchement la plupart des façons de faire en quelque sorte exécuter Python directement à partir de l'intérieur de la JVM ne fonctionnent pas. Ils ne sont pas tout à fait compatible (nouvelle version de votre bibliothèque tierce pouvez utiliser la version 2.6 de python fonctions et ne fonctionnera pas avec Python 2.5) ou hacky (il va rompre avec cryptique JVM stacktrace pas vraiment conduisant à la solution).
Ma manière préférée de l'intégration des deux serait d'utiliser RPC. XML RPC n'est pas un mauvais choix ici, si vous avez des quantités modérées de données. Il est assez bien pris en charge — Python a dans sa bibliothèque standard. Les bibliothèques Java sont également faciles à trouver. Maintenant, selon votre installation de Java ou Python serait un serveur accepte la connexion d'autres langues.
Moins de succès, mais à considérer autre façon de faire Rpc est Google protobuffers, qui ont 2/3 de soutien pour nice rpc. Vous avez juste besoin de fournir votre couche de transport. Pas que beaucoup de travail et de la commodité de l'écriture est raisonnable.
Une autre option est d'écrire un C wrapper autour des œuvres des fonctionnalités de Python que vous devez exposer à de Java et de l'utiliser via la JVM natif de plugins. Vous pouvez soulager la douleur en allant avec SWIG SWIG.
Essentiellement dans votre cas, il fonctionne comme ça:
Cette solution est assez complexe, un peu exagéré dans la plupart des cas. Il est toujours utile de le faire si vous (pour certaines raisons) ne peut pas se permettre de Rpc. RPC serait encore mon préféré, cependant.
De nombreuses années plus tard, il suffit d'ajouter une option qui est de plus en plus populaire ces jours-ci...
Si vous avez besoin Disponible fonctionnalité, py4j est une bonne option. py4j a vu la vu des mises à jour fréquentes dans
20162017 et a acquis une certaine popularité, car il est par exemple utilisée par Apache Spark pour atteindre Disponible à l'interopérabilité.J'aime beaucoup JNA:
Mon 0.02$ 🙂
Vous pouvez utiliser un service de messagerie comme ActiveMQ. Il a à la fois Python et le support de Java. De cette façon, vous pouvez laisser la complexité de la JNI ou C les liaisons qu'ils sont et de les traiter uniquement avec ce que je considère comme une interface simple. En outre, lorsque la bibliothèque est mise à jour, vous n'avez pas besoin de beaucoup de changement, si quoi que ce soit.
Avez-vous pensé à l'exécution de Jython sur la machine virtuelle Java?
Je l'ai étudié une configuration similaire avec JNI. Peut-être que cela vous aidera si vous n'avez pas encore vu:
http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python
http://jpe.sourceforge.net/
Si vous pouvez obtenir votre code Python pour travailler en Jython, alors vous devriez être en mesure de l'utiliser pour appeler à partir de Java: