2014-04-19 62 views
0

我的Jython脚本正在调用一些我正在用Java编写的代码(因为我更熟悉Java多线程)。现在事实证明,我需要从Java中调用其中一个Jython方法(否则我将不得不用Java重新编写它)。从Java调用Jython(Jython脚本调用Java,然后必须调用Jython)

从Jython驱动Java很容易,而且它也很容易设置,使得Java成为主人,Jython成为奴隶,但它并不那么明显,设置它以便他们可以调用的最佳方式是什么彼此。

官方文档包含关于这一切的非常长的一篇文章:Chapter 10: Jython and Java Integration,这让初看起来很难:一对一的对象工厂,松散耦合的工厂以及使其工作的许多代码。

还有我发现其他来源也进入了很多细节,但是没有提供任何简单的解决方案:

既然有一个Jython解释器已经运行了,应该有一个简单的方法来调用它的一个方法,而不必实例化一个新的interp reter(就像上面的最后一个链接一样,如果Java开着Jython的话你需要做的就是这样)。实际上有这样一种方式吗?

回答

0

This article建议一个简单的解决方案,下面的例子工作。 Java的:

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,作为一种回调,除非在这种情况下,它不是用于异步请求的工具,而是用于跨语言请求。


编辑:我不知道哪里是给我们留下了多线程。我将从Java代码中创建和启动的另一个线程中调用Jython方法,所以我希望Jython解释器确保同步访问自身...

+0

实际上,Jython的多线程甚至比CPython更好https:/ /www.jeffknupp.com/blog/2013/06/30/pythons-hardest-problem-revisited因此,我猜想解释发生在每个线程分开,唯一需要担心的是多线程编程的常见方面。另外:http://www.jython.org/jythonbook/en/1.0/Concurrency.html也表示'list','dict'和'set'已经同步。所以,少一点担心! –