2011-05-12 17 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')");