2014-04-19 3 views
0

Mon script Jython appelle du code que j'écris en Java (parce que je suis plus à l'aise avec le multithreading Java). Maintenant, il s'avère que j'ai besoin d'appeler l'une des méthodes Jython de Java (sinon je devrais le réécrire en Java). Il est facile de piloter Java à partir de Jython, et il est aussi simple de configurer Java comme maître et Jython comme esclave, mais ce n'est pas aussi évident de savoir comment l'installer. L'un et l'autre.Appelez Jython depuis Java (le script Jython appelle Java, qui doit ensuite rappeler Jython)

La documentation officielle contient un très long article sur tout cela: Chapter 10: Jython and Java Integration, ce qui rend la tâche difficile à première vue: des usines d'objets personnalisés, des usines à couplage lâche et beaucoup de code pour le faire fonctionner .

Il existe d'autres sources que j'ai trouvé qui vont aussi dans beaucoup de détails, mais ni offre des solutions simples:

Comme il est un interpréteur Jython déjà en cours d'exécution, il devrait y avoir un moyen simple d'appeler une méthode, sans avoir à instancier une nouvelle interp rete (comme dans le dernier lien ci-dessus, et comme vous auriez besoin de le faire si Java conduisait Jython). Existe-t-il réellement un tel moyen?

Répondre

0

This article suggéré une solution simple, et l'exemple suivant travaillé. Java:

import org.python.core.PyObject; 

public class JythonFromJava { 
    public void callPO(PyObject po) { 
     po.__call__(); 
    } 
} 

Compilé avec:

$ javac -classpath ".;C:\Programs\jython2_7b1\jython.jar" JythonFromJava.java 

Jython:

import JythonFromJava 

def method(): 
    print "METHOD called" 

j = JythonFromJava() 
j.callPO(method) 

Son exécution:

$ jython jython_from_java_j.py 
METHOD called 

Il semble donc que est tout ce qu'il faut. Nous avons besoin d'envoyer un handle à la méthode Jython en Java, comme une sorte de callback, sauf dans ce cas ce n'est pas un outil pour les requêtes asynchrones, mais pour les requêtes inter-langues.


EDIT: Je ne sais pas où cela nous laisse avec multithreading. J'appellerai la méthode Jython à partir d'un autre thread créé et démarré dans le code Java, donc j'espère que l'interpréteur Jython lui assurera un accès synchronisé ...

+0

En fait, Jython est encore meilleur avec le multithreading qu'avec CPython https://www.jeffknupp.com/blog/2013/06/30/pythons-hardest-problem-revisited Donc, je suppose que l'interprétation se passe sur chaque thread séparément, et les seules choses qui restent à s'inquiéter sont les aspects habituels de la programmation multithread. Aussi: http://www.jython.org/jythonbook/en/1.0/Concurrency.html qui dit aussi que 'list',' dict' et 'set' sont déjà synchronisés. Donc, une chose de moins à s'inquiéter! –