使用 JSR-223 从 Jython 脚本获取数据
我正在使用 Jython 2.5.1 和 JSR-223(即 javax.script 包),并且我希望返回 Python 脚本的最后一行。例如,在评估此脚本后:
class Multiplier:
def multiply(self, x, y):
return x * y
Multiplier().multiply(5, 7)
我应该返回 35,但我得到的是 null。另一方面,它与其他测试一起使用:
5 * 7
我做错了什么?
下面是 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 中工作得很好,即总是返回最后一行。
提前致谢。
I am using Jython 2.5.1 with JSR-223 (i.e. javax.script package) and I expect the last line of the Python script to be returned. For example, after evaluating this script:
class Multiplier:
def multiply(self, x, y):
return x * y
Multiplier().multiply(5, 7)
I should get back 35, but I get null instead. In other hand it works with this other test:
5 * 7
What am I doing wrong?
Here's the Java code:
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: It works fine with JRuby, Groovy and Rhino, i.e. the last line is always returned.
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
更新:实际上,我在最初的答案中错过了OP的目标(和问题),这一点已在评论中得到澄清。我正在相应地更新我的答案。
首先更新
Multiplier.py
脚本,如下所示:然后从 Java 代码中这样调用它:
运行上面的代码时,我得到以下输出:
UPDATE: I was actually missing the goal (and problem) of the OP in my initial answer that has been clarified in a comment. I'm updating my answer accordingly.
First update the
Multiplier.py
script as below:Then call it like this from the Java code:
I get the following output when running the code above:
这是一个 Python 语言问题,而不是 Jython 或 JSR 223 问题。 Python 区分表达式(有值)和语句(没有值)。您传递的脚本是一个声明。如果您传递一个表达式,它就会有一个值。
您在 Ruby 和 JavaScript 中看到不同的原因是复合语句具有最后评估的语句的值。例如,将 Ruby
与 Python 进行比较:
JavaScript 似乎介于两者之间。与 Ruby 一样,赋值的计算结果是分配的值。但是,返回块中最后一个计算的语句,但不能用作表达式的一部分:
This is a Python language issue more than a Jython or JSR 223 issue. Python differentiates between expressions (which have values) and statements (which don't). The script you're passing is a statement. If you passed an expression, it'd have a value.
The reason you're seeing something different with Ruby and JavaScript is that compound statements have the value of the last statement evaluated. For example, compare Ruby:
with Python:
JavaScript seems to be somewhere in between. Like Ruby, assignments evaluate to the value assigned. However, the last evaluated statement in a block is returned but not usable as part of an expression:
我也有同样的问题。我编写了一个支持 JSR223 的脚本库并提交了 http://bugs.jython.org/issue1798 :
至少如果您
eval("x=5\nx")
,您似乎会得到该值。I had the same problem. I have written a scripting library that supports JSR223 and have submited http://bugs.jython.org/issue1798:
At least if you
eval("x=5\nx")
it seems like you would get the value back.