Why must "exec" (and not "eval") be used for Python import statements?
Question: 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.


Answer: 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.

