2014-04-19 99 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'已經同步。所以,少一點擔心! –