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

时间:2012-08-09 15:14:37

标签: python eval jython

我正在尝试使用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

但是,如果我尝试将两条线组合在一起,那么一切都会破裂。这样:

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文件不是一种选择。

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:6)

试试这个,

eval("__import__('re').match('abc', 'abc123')")

答案 2 :(得分:1)

这里的结果是什么意思?

我假设它是你脚本的一些计算值。根据'exec'的文档,代码在当前范围内运行。因此,您必须能够访问在exec语句中创建的任何新符号的值。

a = 20
b = 10
exec("c = a + b")
print c

以上代码应打印30。