Простой Jython-скрипт не запускается из Java - PullRequest
3 голосов
/ 04 августа 2011

Я работаю над большим проектом Java, где сценарии Jython интерпретируются из кода Java. По причине, которую я еще не выяснил, в скрипте Jython ничего не работает, если функции, класс, переменные не объявлены как глобальные. В попытке отследить эту проблему, я сузил проблему до этого. Ниже приведены:

  • Jython-скрипт script.py, который хорошо работает при запуске с java -jar jython.jar script.py
  • Основной класс Java Interpreter.java, который использует методы Jython 2.2 для интерпретации приведенного выше сценария Jython

Python-скрипт:

#global aFunction # uncommenting this makes the script work from Java

def main():
    aFunction()


def aFunction():
    print 'aFunction() called'


main()

Класс Java:

import java.io.File;

import org.python.core.PyException;
import org.python.core.PyStringMap;
import org.python.core.PySystemState;


public class Interpreter {

    public static void main(final String[] args) {
        final PyStringMap localNameSpace = new PyStringMap();
        final PyStringMap globalNameSpace = new PyStringMap();

        final File scriptFile = new File("../../jython/script.py");       
        PySystemState.initialize();

        try {
            org.python.core.__builtin__.execfile(scriptFile.getAbsolutePath(), globalNameSpace, localNameSpace);
        } catch (final PyException pyException) {
            pyException.printStackTrace();
        }

    }

}

Вот ошибка, которую я получаю при запуске класса Java.

Traceback (innermost last):
  File "/opt/coflight/axel/workspace/essais/../../jython/script.py", line 12, in ?
  File "/opt/coflight/axel/workspace/essais/../../jython/script.py", line 5, in main
NameError: aFunction

Есть идеи о том, как исправить класс Java, чтобы интерпретатор мог запустить скрипт Jython? Спасибо!

1 Ответ

3 голосов
/ 04 августа 2011

Я не могу объяснить ошибку, которую вы получаете, но я смог заставить ее работать, используя PythonInterpreter:

org.python.util.PythonInterpreter interp = new org.python.util.PythonInterpreter();
String scriptname = "script.py"; 
interp.execfile(scriptname);
...