Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why must "exec" (and not "eval") be used for Python import statements?

I'm trying to run a snippet of Python from within Java, using Jython. If I use an exec statement to import, everything works.

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

If, however, I try to combine the two lines, all hell breaks loose. This:

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')"); // ....

...throws an exception "no viable alternative at input 'import'", ('<string>',1,0,'import re\n').

This matters, because ideally I'd like to be able to eval a whole script as a single string, without having to break the imports out into a separate part. Am I doing something wrong? Is there another way to tell Jython "take this whole blob of script, including imports, and run it, then give me back a result"? This needs to be at runtime -- pre-compiling the Python into .class files is not an option.

like image 804
Coderer Avatar asked Aug 09 '12 15:08

Coderer


1 Answers

The problem is that eval evaluates expressions and returns some result, while exec executes statements in some context. import is a statement, while re.match() is an expression.

like image 120
Rostyslav Dzinko Avatar answered Sep 30 '22 20:09

Rostyslav Dzinko