使用JSR223从Jython脚本获取数据

2024-09-28 22:43:10 发布

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

我使用的是jython2.5.1和JSR-223(即。javax.script包),我希望返回Python脚本的最后一行。例如,评估此脚本后:

class Multiplier:

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

Multiplier().multiply(5, 7)

我应该回35,但是我得到的是零。另一方面,它与另一个测试一起工作:

^{pr2}$

我做错什么了?在

以下是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);
}

PS:它与JRuby、Groovy和Rhino配合得很好,即总是返回最后一行。在

提前谢谢。在


Tags: self脚本newreturndefscriptresultengine
3条回答

我也有同样的问题。我编写了一个支持JSR223的脚本库,并提交了http://bugs.jython.org/issue1798

$ python
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x=5<br/>
>>> x<br/>
5
>>>

至少,如果你eval("x=5\nx")看起来你会得到这个值。在

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

您看到Ruby和JavaScript不同的原因是,复合语句的值是最后一个语句的值。例如,比较Ruby:

>> (2 ; 3) + 5
=> 8
>> (x = 5) + 7
=> 12

使用Python:

^{pr2}$

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

> { 2 ; 3 }
3
> { 2 ; 3 } + 5
5
> (x = 5) + 7
12

更新:在我最初的回答中,我实际上遗漏了OP的目标(和问题),该问题已在评论中澄清。我正在相应地更新我的答案。在

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

class Multiplier:

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

x = Multiplier().multiply(5, 7)

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

^{pr2}$

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

x: 35

相关问题 更多 >