Вызов Jython из Java (Jython-скрипт вызывает Java, который затем должен вызвать Jython)
Мой Jython-скрипт вызывает некоторый код, который я пишу на Java (потому что мне удобнее с многопоточностью Java). Теперь выясняется, что мне нужно вызвать один из методов Jython из Java (в противном случае мне пришлось бы переписать его на Java).
Легко управлять Java из Jython, а также просто настроить все так, чтобы Java был главным, а Jython - подчиненным, но не так очевидно, как лучше настроить его так, чтобы они могли вызывать друг друга.
Официальная документация содержит очень длинную статью обо всем этом: Глава 10: Интеграция Jython и Java, которая на первый взгляд делает задачу трудной: фабрики объектов один-к-одному, слабо связанные фабрики и много кода для создания это работает.
Я нашел и другие источники, которые также вошли в подробности, но ни один не предлагает простых решений:
Поскольку уже работает интерпретатор Jython, должен быть простой способ вызова метода в нем без необходимости создания экземпляра нового интерпретатора (как в последней ссылке выше, и как вам нужно было бы сделать, если бы Java управляла Jython), Есть ли на самом деле такой способ?
1 ответ
Эта статья предложила простое решение, и следующий пример сработал. Джава:
import org.python.core.PyObject;
public class JythonFromJava {
public void callPO(PyObject po) {
po.__call__();
}
}
Составлено с:
$ javac -classpath ".;C:\Programs\jython2_7b1\jython.jar" JythonFromJava.java
Jython:
import JythonFromJava
def method():
print "METHOD called"
j = JythonFromJava()
j.callPO(method)
Запуск это:
$ jython jython_from_java_j.py
METHOD called
Кажется, это все, что нужно. Нам нужно отправить дескриптор метода Jython в Java как своего рода обратный вызов, за исключением того, что в этом случае это не инструмент для асинхронных запросов, а для запросов между языками.
РЕДАКТИРОВАТЬ: Я не уверен, где это оставляет нас с многопоточностью. Я буду вызывать метод Jython из другого потока, который создан и запущен в коде Java, поэтому я надеюсь, что интерпретатор Jython обеспечивает синхронизированный доступ к самому себе...