L'appel de Java à partir de Python
Quelle est la meilleure façon de faire des appels java à partir de python?
(jython et RPC ne sont pas une option pour moi).
J'ai entendu parler de CCC: http://pypi.python.org/pypi/JCC/1.9
un générateur de code C++ pour l'appel de Java à partir de C++/Python
Mais cela nécessite la compilation à chaque appel possible; je préfère une autre solution.
J'ai entendre parler de JPype: http://jpype.sourceforge.net/
tutoriel: http://www.slideshare.net/onyame/mixing-python-and-java
import jpype
jpype.startJVM(path to jvm.dll, "-ea")
javaPackage = jpype.JPackage("JavaPackageName")
javaClass = javaPackage.JavaClassName
javaObject = javaClass()
javaObject.JavaMethodName()
jpype.shutdownJVM()
Cela ressemble à ce dont j'ai besoin.
Cependant, la dernière version de janvier 2009 et je vois des gens à défaut de compiler JPype.
Est JPype un projet mort?
Existe-il d'autres alternatives?
Ce qui concerne,
David
- Pourriez-vous expliquer pourquoi vous pensez que Jython et RPC ne sont pas une option pour votre situation?
- Il ressemble, en attendant, il y avait une nouvelle JPype de presse: 0.5.4.2 sur 2011-07-28
Vous devez vous connecter pour publier un commentaire.
Voici mon résumé de ce problème: 5 Façons de l'Appel de Java à partir de Python
http://baojie.org/blog/2014/06/16/call-java-from-python/ (cache)
Réponse courte: Jpype fonctionne assez bien et a fait ses preuves dans de nombreux projets (tels que python-boilerpipe), mais Pyjnius est plus rapide et plus simple que JPype
J'ai essayé Pyjnius/Jnius, CCC, javabridge, Jpype et Py4j.
Py4j est un peu difficile à utiliser, que vous avez besoin pour commencer une passerelle, en ajoutant une autre couche de fragilité.
Vous pouvez également utiliser Py4J. Il y a un exemple sur la page d'accueil et beaucoup de documentation, mais essentiellement, il vous suffit d'appeler méthodes de Java à partir de votre code python comme si elles étaient python méthodes:
Par opposition à Jython, une partie de Py4J s'exécute dans le Python VM de sorte qu'il est toujours "up to date" avec la dernière version de Python et vous pouvez utiliser des bibliothèques qui ne fonctionne pas très bien sur Jython (par exemple, lxml). L'autre partie s'exécute dans la machine virtuelle Java que vous souhaitez appeler.
La communication se fait à travers des sockets à la place de la JNI et Py4J a son propre protocole (afin d'optimiser certains cas, à la gestion de la mémoire, etc.)
Avertissement: je suis l'auteur de Py4J
s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();
Ici la classe Base64 a la méthode encode() et decode() et fait partie du paquetch.ethz.ssh2.crypto
dans mon .fichier jar. Je reçoisfrom py4j.reflection import MethodInvoker ImportError: No module named reflection
Pyjnius.
Docs: http://pyjnius.readthedocs.org/en/latest/
Github: https://github.com/kivy/pyjnius
À partir de la page github:
Je suis sur OS x 10.10.2, et a réussi à l'aide de JPype.
Couru dans des problèmes d'installation avec Jnius (d'autres ont trop), Javabridge installé mais a donné des erreurs mystérieuses quand j'ai essayé de l'utiliser, PyJ4 a ce désagrément d'avoir à démarrer un serveur de Passerelle en Java tout d'abord, CCC ne serait pas à installer. Enfin, JPype retrouvé de travail. Il y a un maintenu fourche de JPype sur Github. Il a l'avantage majeur que (a) il s'installe correctement, et (b), il peut très efficacement convertir java les tableaux de tableau numpy (
np_arr = java_arr[:]
)Le processus d'installation a été:
Et vous devriez être en mesure de
import jpype
La démonstration suivante travaillé:
Quand j'ai essayé d'appeler mon propre code java, j'ai dû d'abord compiler (
javac ./blah/HelloWorldJPype.java
), et j'ai dû changer la JVM chemin d'accès par défaut (sinon vous obtiendrez inexplicable "class not found", erreurs). Pour moi, cela impliquait un changement de la startJVM de commande à:Si vous êtes en Python 3, il y a une fourchette de JPype appelé JPype1-py3
Cela fonctionne pour moi sur OSX /Python 3.4.3. (Vous devrez peut-être
export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version
)Je suis juste au début de l'utilisation JPype 0.5.4.2 (juillet 2011) et il semble que ça fonctionne bien...
Je suis sur Xubuntu 10.04
J'ai été l'intégration de beaucoup de choses en Python dernièrement, y compris Java. Le plus robuste de la méthode que j'ai trouvé est d'utiliser IKVM et un C# wrapper.
IKVM a une jolie petite application qui vous permet de prendre en Java JAR, et de le convertir directement .Net DLL. Il traduit simplement le bytecode JVM CLR bytecode. Voir http://sourceforge.net/p/ikvm/wiki/Ikvmc/ pour plus de détails.
Les convertis de la bibliothèque se comporte comme un natif C# bibliothèque, et vous pouvez l'utiliser sans avoir besoin de la JVM. Vous pouvez ensuite créer un C# wrapper DLL projet, et d'ajouter une référence à la conversion DLL.
Vous pouvez maintenant créer des wrapper talons que d'appeler les méthodes que vous souhaitez exposer, et de la marque de ces méthodes comme DllEport. Voir https://stackoverflow.com/a/29854281/1977538 pour plus de détails.
Le wrapper DLL comporte comme un natif de la bibliothèque C, avec de l'export des méthodes de recherche, juste comme C exportées méthodes. Vous pouvez vous connecter à l'aide de ctype comme d'habitude.
Je l'ai essayé avec Python 2.7, mais il devrait fonctionner avec la version 3.0 ainsi. Fonctionne sur Windows et le Linuxes
S'il vous arrive d'utiliser le C#, alors c'est probablement la meilleure approche pour essayer lors de l'intégration de presque rien en python.
Je suppose que si vous pouvez obtenir à partir de C++ à Java, alors vous êtes tous ensemble. J'ai vu un produit de la nature que vous mentionnez bien travailler. Comme il arrive celui que nous avons utilisé était CodeMesh. Je ne suis pas spécialement en approuvant ce vendeur, ou de faire une déclaration au sujet de leur produit de qualité relative, mais je l'ai vu travailler dans un grand volume d'scénario.
Je dis généralement que si possible je voudrais vous recommandons de conserver à l'écart de l'intégration directe via JNI si vous le pouvez. Certains simple RESTE approche axée sur le service, ou de la file d'attente basé sur une architecture aura tendance à être plus simple à développer et à diagnostiquer. Vous pouvez obtenir assez décent perfomance si vous utilisez un tel découplé technologies soigneusement.
Travers de ma propre expérience en essayant d'exécuter du code java à partir de l'intérieur de python j'ai une manière similaire à la façon python code s'exécute dans le code java, en python, j'ai été incapable de trouver un simple méthodologie.
Ma solution à mon problème a été en cours d'exécution de ce code java que des scripts en appelant le beanshell interprète comme une coquille commnad de dans mon code python après l'édition du code java dans un fichier temporaire avec les packages appropriés et les variables.
Si ce dont je parle est utile d'une quelconque manière, je suis heureux de vous aider à partager plus de détails de mes solutions.