javax.script.ScriptEngine не работает во время выполнения - PullRequest
2 голосов
/ 29 января 2010

Есть идеи? Публичный класс Main {

public static void main(String[] args) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");
    engine.put("hello_str", "");
    engine.eval("for i in range(10):");
    engine.eval("   hello_str += str(i)");
    Object x = engine.get("hello_str");
    System.out.println("x: " + x);
}

}

ошибка

Исключение в потоке "основной" в org.python.jsr223.PyScriptEngine.scriptException (PyScriptEngine.java:170) на org.python.jsr223.PyScriptEngine.compileScript (PyScriptEngine.java:76) в org.python.jsr223.PyScriptEngine.eval (PyScriptEngine.java:33) в javax.script.AbstractScriptEngine.eval (AbstractScriptEngine.java:247) в javaapplication2.Main.main (Main.java:23) Вызывается: Файл "", строка 1 для я в диапазоне (10): ^ Ошибка синтаксиса: несоответствующий ввод, ожидание INDENT

1 Ответ

2 голосов
/ 29 января 2010

Похоже, вы пытаетесь оценить неполное утверждение в строках:

engine.eval("for i in range(10):");
engine.eval("   hello_str += str(i)");

Здесь, я предполагаю, eval() пытается оценить их один за другим, и ничего не находит после того, как for дает ошибку, поскольку это неполное утверждение. Попробуйте это:

engine.eval("for i in range(10):\n   hello_str += str(i)");

В этом случае символ новой строки не требуется, но это может быть необходимо, если вы хотите включить несколько операторов в тело цикла, например:

engine.eval("for i in range(10):\n   hello_str += str(i)\n   print i");

Также обратите внимание, что в приведенном выше примере интервал после каждой новой строки должен быть равен. На самом деле, я бы предложил полностью собрать строку сценария перед его оценкой. Или еще лучше, прочитайте его из отдельного файла .py.

...