2011-01-06 62 views
1

我試圖做同樣的事情,以Question 4617364但對於Python的正確初始化 - 從python腳本文件,其中所述類實現了Java接口,並把它交給一些加載類可以使用其方法的Java代碼 - 但調用對象方法返回無效值並從初始化程序打印似乎沒有任何作用。Jython腳本執行一類是不從Java

我的實現看起來是這樣的:

接口:

package some.package; 
import java.util.List; 
public interface ScriptDemoIf { 
    int fibonacci(int d); 
    List<String> filterLength(List<String> source, int maxlen); 
} 

Python實現:

from some.package import ScriptDemoIf 

class ScriptDemo(ScriptDemoIf): 
    """ Class ScriptDemo implementing ScriptDemoIf """ 

    def __init__(self): 
     print "Script Demo init" 

    def fibonacci(self, d): 
     if d < 2: 
      return d 
     else: 
      return self.fibonacci(d-1) + self.fibonacci(d-2) 

    def filterLength(self, source, maxlen): 
     return [ str for str in source if len(str) <= maxlen ] 

類裝載器:

public ScriptDemoIf load(String filename) throws ScriptException { 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython"); 
    FileReader script = new FileReader(filename); 
    try { 
     engine.eval(new FileReader(script)); 
    } catch (FileNotFoundException e) { 
     throw new ScriptException("Failed to load " + filename); 
    } 
    return (ScriptDemoIf) engine.eval("ScriptDemo()"); 
} 

public void run() { 
    ScriptDemoIf test = load("ScriptDemo.py"); 
    System.out.println(test.fibonacci(30)); 
} 

(顯然裝載機有點在現實生活中更通用 - 它並不假設實現類名是「ScriptDemo」 - 這只是爲了簡單)。

當代碼正在跑,我看不出從Python的__init__(不過,如果我把打印腳本的身體,然後我就看到)打印,但在run()模樣test變量一個有效的jython「代理對象」,我沒有得到鑄造錯誤。當我嘗試運行fibonacci()方法我總是得到0(即使我改變方法總是返回一個固定的數)和filterLength()方法始終返回null(可能是一些根據Java界面默認爲這樣做)。

我做錯了什麼?

您使用什麼版本的Jython的
+0

我沒有用的Jython,但'getEngineByName所( 「JRuby的」)'脫穎而出。當然,這需要是「jython」? – 2011-01-06 19:37:49

+0

感謝您注意到 - 我修好了。代碼基本上是一樣的,所以我剛剛從我以前的問題中複製過來。抱歉。 – Guss 2011-01-06 19:41:37

+0

爲什麼有'engine'和'm_engine'? – jfs 2011-01-19 18:10:37

回答

2

?你可能已經運行到JSR223 Jython的錯誤:http://bugs.jython.org/issue1681

從錯誤描述:

調用從嵌入的Jython腳本方法不執行任何操作時 使用JSR223和Jython 2.5.2rc2,而2.2的Jython .1工作正常。

+0

事實上,這是很明顯的問題 - 我是用Jython 2.5.2rc2和優化升級,Jython的2.5.2rc3解決了這個問題對我來說。謝謝! – Guss 2011-01-20 12:48:46