为什么必须将"exec"(而不是"eval")用于Python导入语句?

Cod*_*rer 13 python jython eval

我正在尝试使用Jython从Java中运行一段Python.如果我使用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
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将两条线组合在一起,那么所有的地狱都会破裂.这个:

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')"); // ....
Run Code Online (Sandbox Code Playgroud)

...引发异常"no viable alternative at input 'import'", ('<string>',1,0,'import re\n').

这很重要,因为理想情况下我希望能够将整个脚本作为单个字符串进行评估,而不必将导入分成单独的部分.难道我做错了什么?有没有另一种方法告诉Jython"采取这整个脚本,包括导入,然后运行它,然后给我一个结果"?这需要在运行时 - .class不能将Python预编译到文件中.

Ros*_*nko 18

问题是eval 评估表达式返回一些结果,而exec 在某些上下文中执行语句.import是一个语句,而re.match()是一个表达式.


use*_*192 6

试试这个,

eval("__import__('re').match('abc', 'abc123')")
Run Code Online (Sandbox Code Playgroud)