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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With