13

我正在尝试使用 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文件不是一种选择。

4

3 回答 3

18

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

于 2012-08-09T15:17:40.987 回答
7

试试这个,

eval("__import__('re').match('abc', 'abc123')")
于 2012-08-11T13:37:33.463 回答
1

这里的结果是什么意思?

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

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

上面的代码应该打印 30。

于 2012-08-09T15:57:36.400 回答