簡體   English   中英

使用JSR-223從Jython腳本中獲取數據

[英]Get data back from Jython scripts using JSR-223

我正在使用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,即最后一行總是返回。

提前致謝。

這是一個Python語言問題,而不是Jython或JSR 223問題。 Python區分表達式(具有值)和語句(不具有)。 您傳遞的腳本是一個聲明。 如果你傳遞了一個表達式,它就有一個值。

你看到Ruby和JavaScript不同的原因是復合語句具有最后一個語句的值。 例如,比較Ruby:

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

用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

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代碼中調用它:

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);
}

運行上面的代碼時,我得到以下輸出:

x: 35

我有同樣的問題。 我編寫了一個支持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")你似乎會得到這個價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM