Je pense qu'il y a des choses importantes à prendre en compte en premier lieu pour déterminer la force du lien entre Java et Python.
Tout d'abord Voulez-vous seulement appeler des fonctions ou voulez-vous réellement que du code python modifie les données de vos objets java ? Cette question est très importante. Si vous voulez seulement appeler du code python avec ou sans arguments, ce n'est pas très difficile. Si vos arguments sont des primitives, c'est encore plus facile. Cependant, si vous voulez que la classe java implémente des fonctions membres en python, qui modifient les données de l'objet java, ce n'est pas si facile ou direct.
Ensuite, parlons-nous de cpython ou de jython ? Je dirais que cpython est là où il faut ! Je dirais que c'est la raison pour laquelle Python est si cool ! Avoir des abstractions aussi élevées, mais avoir accès à c, c++ quand on en a besoin. Imaginez si vous pouviez avoir cela en java. Cette question ne vaut même pas la peine d'être posée si jython est ok parce qu'alors c'est facile de toute façon.
J'ai donc joué avec les méthodes suivantes, et je les ai classées de faciles à difficiles :
De Java à Jython
Avantages : Trivialement facile. Avoir des références réelles aux objets java
Inconvénients : Pas de CPython, extrêmement lent !
Jython à partir de java est si facile, et si cela suffit vraiment, alors tant mieux. Cependant, il est très lent et il n'y a pas de cpython ! La vie vaut-elle la peine d'être vécue sans cpython ? Je ne le pense pas ! Vous pouvez facilement avoir du code python implémentant vos fonctions membres pour vos objets java.
De Java à Jython à CPython via Pyro
Pyro est le module d'objets distants pour python. Vous avez un objet sur un interpréteur cpython, et vous pouvez lui envoyer des objets qui sont transférés via la sérialisation et il peut aussi retourner des objets via cette méthode. Notez que si vous envoyez un objet python sérialisé depuis jython et que vous appelez ensuite des fonctions qui modifient les données de ses membres, vous ne verrez pas ces modifications dans java. Vous devez simplement vous rappeler de renvoyer les données que vous voulez de pyro. Je pense que c'est le moyen le plus simple d'accéder à cpython ! Vous n'avez pas besoin de jni, jna, swig ou ..... Vous n'avez pas besoin de connaître le c, ou le c++. super hein ?
Avantages : Accès à cpython, pas aussi difficile que les méthodes suivantes
Inconvénients : Impossible de modifier les données membres des objets java directement depuis python. C'est plutôt indirect, (jython est un intermédiaire).
Java vers C/C++ via JNI/JNA/SWIG vers Python via un interpréteur embarqué (peut-être en utilisant les bibliothèques BOOST ?)
OMG, cette méthode n'est pas pour les âmes sensibles. Et je peux vous dire qu'il m'a fallu beaucoup de temps pour y parvenir avec une méthode décente. La raison principale pour laquelle vous voulez faire cela est que vous pouvez exécuter du code cpython qui a un contrôle total sur votre objet java. Il y a des choses importantes à prendre en compte avant de décider d'essayer de panifier java (qui est comme un chimpanzé) avec python (qui est comme un cheval). Tout d'abord, si vous plantez l'interpréteur, c'est l'extinction des feux pour votre programme ! Et ne me lancez pas sur les problèmes de concurrence ! En outre, il y a beaucoup de chaudière, je crois que j'ai trouvé la meilleure configuration pour minimiser cette chaudière mais c'est quand même beaucoup ! Alors comment faire : Considérez que le C++ est votre intermédiaire, vos objets sont en fait des objets C++ ! C'est bien que vous le sachiez maintenant. Ecrivez simplement votre objet comme si votre programme était en cpp et non en java, avec les données auxquelles vous voulez accéder depuis les deux mondes. Ensuite, vous pouvez utiliser le générateur de wrapper appelé swig ( http://www.swig.org/Doc1.3/Java.html ) pour le rendre accessible à java et compiler une dll que vous appelez System.load(nom de la dll ici) en java. Commencez par faire fonctionner tout cela, puis passez à la partie la plus difficile ! Pour accéder à Python, vous devez intégrer un interpréteur. Tout d'abord, je vous suggère de faire quelques programmes d'interprétation de type hello ou de suivre ce tutoriel. Intégrer python dans C/C . Une fois que cela fonctionne, il est temps de faire danser le cheval et le singe ! Vous pouvez envoyer votre objet c++ à python via [boost][3] . Je sais que je ne vous ai pas donné le poisson, je vous ai simplement dit où trouver le poisson. Quelques points à noter lors de la compilation.
Lorsque vous compilez boost, vous devez compiler une bibliothèque partagée. Et vous devez inclure et lier les éléments dont vous avez besoin de jdk, c'est-à-dire jawt.lib, jvm.lib, (vous aurez également besoin du client jvm.dll dans votre chemin lors du lancement de l'application) ainsi que python27.lib ou autre et boost_python-vc100-mt-1_55.lib. Ensuite, incluez Python/include, jdk/include, boost et n'utilisez que des librairies partagées (dlls) sinon boost a la larme à l'oeil. Et oui, je sais. Il y a tellement de façons dont cela peut tourner au vinaigre. Donc assurez-vous de faire chaque chose bloc par bloc. Puis mettez-les ensemble.
4 votes
Veuillez consulter la question similaire et lire la réponse. bytes.com/topic/python/answers/