Я пытаюсь запустить фрагмент 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
невозможна.