使用 JSR-223 从 Jython 脚本获取数据

Tia*_*dez 2 python java jython jsr223

我正在使用 Jython 2.5.1 和 JSR-223(即 javax.script 包),并且我希望返回 Python 脚本的最后一行。例如,评估此脚本后:

class Multiplier:

  def multiply(self, x, y):
    return x * y

Multiplier().multiply(5, 7)
Run Code Online (Sandbox Code Playgroud)

我应该返回 35,但我得到的是 null。另一方面,它与其他测试一起使用:

5 * 7
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

这是 Java 代码:

public static void main(String[] args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

    FileReader f = new FileReader("Multiplier.py");
    Object result = engine.eval(f);
    //assert(result == 35);
}
Run Code Online (Sandbox Code Playgroud)

PS:它与 JRuby、Groovy 和 Rhino 一起工作得很好,即总是返回最后一行。

提前致谢。

Pas*_*ent 5

更新:实际上,我在最初的答案中错过了OP的目标(和问题),这一点已在评论中得到澄清。我正在相应地更新我的答案。

首先更新Multiplier.py脚本如下:

class Multiplier:

  def multiply(self, x, y):
    return x * y

x = Multiplier().multiply(5, 7)
Run Code Online (Sandbox Code Playgroud)

然后从 Java 代码中这样调用它:

public static void main(String[] args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

    FileReader f = new FileReader("Multiplier.py");
    engine.eval(f);
    Object x = engine.get("x");
    System.out.println("x: " + x);
}
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,我得到以下输出:

x: 35
Run Code Online (Sandbox Code Playgroud)


Nic*_*ley 5

这是一个 Python 语言问题,而不是 Jython 或 JSR 223 问题。Python 区分表达式(有值)和语句(没有值)。您传递的脚本是一个声明。如果您传递一个表达式,它就会有一个值。

您在 Ruby 和 JavaScript 中看到不同的原因是复合语句具有最后评估的语句的值。例如,比较 Ruby:

>> (2 ; 3) + 5
=> 8
>> (x = 5) + 7
=> 12
Run Code Online (Sandbox Code Playgroud)

使用Python:

>>> (2 ; 3) + 5
  File "<stdin>", line 1
    (2 ; 3) + 5
       ^
SyntaxError: invalid syntax
>>> (x = 5) + 7
  File "<stdin>", line 1
    (x = 5) + 7
       ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

JavaScript 似乎介于两者之间。与 Ruby 一样,赋值的计算结果是分配的值。但是,返回块中最后一个计算的语句,但不能用作表达式的一部分:

> { 2 ; 3 }
3
> { 2 ; 3 } + 5
5
> (x = 5) + 7
12
Run Code Online (Sandbox Code Playgroud)