Почему для операторов импорта Python необходимо использовать «exec» (, а не «eval» )?

Я пытаюсь запустить фрагмент Python из Java, используя Jython. Если я использую оператор exec для импорта, все работает.

PythonInterpreter pi = new PythonInterpreter();
pi.exec("import re");
PythonObject o = pi.eval("re.match('abc', 'abc123')"); // returns a MatchObject
o = pi.eval("re.match('abc', 'def123')"); // returns Py.None

Однако если я попытаюсь совместить эти две линии, все пойдет к чертям. Это:

PythonInterpreter pi = new PythonInterpreter();
pi.eval("import re"); // exception!
PythonObject o = pi.eval("re.match('abc', 'abc123')"); // never gets here
o = pi.eval("re.match('abc', 'def123')"); //....

...выдает исключение "no viable alternative at input 'import'", ('<string>',1,0,'import re\n').

Это важно, потому что в идеале я хотел бы иметь возможность оценить весь скрипт как одну строку, не разбивая импорт на отдельную часть. Я делаю что-то неправильно? Есть ли другой способ сказать Jython: «Возьми весь этот кусок скрипта, включая импорт, и запусти его, а затем верни мне результат»? Это должно быть во время выполнения --до -. Компиляция Python в файлы .classневозможна.

13
задан Raedwald 17 September 2013 в 19:27
поделиться