Как вызвать функцию Java из встроенного Jython? - PullRequest
1 голос
/ 13 мая 2011

Я создал объект PythonInterpreter и хочу вызвать функцию 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");
    }

Ответы [ 2 ]

1 голос
/ 13 мая 2011

По умолчанию текущий путь к классу включен в путь 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')");
  }
}

И если вы хотите получить доступ к экземпляру java в jython, вы можете использовать py.set(string, object), чтобы сделать его доступным в контексте. (Так же, как javax.scripting)

      App app = new App();
      py.set("appinstance", app);
      py.exec("appinstance.sayHi('hello world')");
1 голос
/ 13 мая 2011

Я обычно нахожу, что мне нужно использовать шаблон фабрики объектов и вызывать вещи через интерфейс, как описано в Jython Book - глава 10

Я до сих пор не совсем ясно, что вы пытаетесь сделать, поэтому у меня нет кода для вас; но я уверен, что вы найдете книгу полезной.

...