2011-05-12 48 views
1

我已經創建了一個PythonInterpreter對象,並希望調用Java的功能,但不斷收到錯誤:如何從嵌入Jython中調用java函數?

Exception in thread "main" Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'jytest2' is not defined 
Java Result: 1 

你如何稱呼從實時運行系統的Java函數?

public static void main(String args[]) 
    {  
     ModRet modRet = new ModRet(); 
     jytest(); 
    } 

public void jytest() 
    { 
     PythonInterpreter interp = new PythonInterpreter(); 

     interp.exec("print \'Hello; jython has successfully been embedded!\'"); 
     interp.exec("print " + FPS); 
     interp.exec("jytest2()"); 

    } 

    public void jytest2() 
    { 
     System.out.println("HIHIHI"); 
    } 
+0

這將會是真正有用的,如果你能發佈一些相關的Jython代碼 – 2011-05-12 20:13:07

+0

我確實發現做到這一點的一種方法:通過運行Jython的構造。但還有另一種方式嗎? – orkel 2011-05-12 20:17:59

+0

'interp.exec(String)'只能在Python/Jython語言中解釋;你有沒有爲解釋而創建的Python函數'jytest2()'?這是我從錯誤信息中可以理解的,因爲它找不到函數...您可能需要先從具有該函數的庫中導入,然後才能使用它。 – eee 2011-05-13 01:28:18

回答

1

總的來說,我發現我需要使用對象工廠模式,如Jython Book - Chapter 10

描述通過接口調用的東西我還是你要完成什麼不超清晰,所以我沒有任何代碼給你;但我相信你會發現這本書很有幫助。

1

默認情況下,當前classpath包含在jython路徑中。要訪問路徑中的任何方法,您應該執行導入。

package com.mycompany.jythontest; 


import org.python.util.PythonInterpreter; 


public class App 
{ 

    public static void sayHello(String hello) { 
    System.out.println(hello); 
    } 

    public static void main(String[] args) 
    { 
     PythonInterpreter py = new PythonInterpreter(); 

     py.exec("from com.mycompany.jythontest import App"); 
     py.exec("App.sayHello('hello')"); 
    } 
} 

如果你想訪問Jython的Java實例,您可以使用py.set(string, object),使其在上下文訪問。 (就像javax.scripting)

 App app = new App(); 
     py.set("appinstance", app); 
     py.exec("appinstance.sayHi('hello world')");