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

2024-09-27 07:30:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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文件不是一个选项。


Tags: importre脚本newmatchevalpijython
3条回答

你说结果是什么意思?

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

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

上面的代码应该打印30。

试试这个

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

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

相关问题 更多 >

    热门问题