2009-12-11 31 views
2

我正在使用Jython 2.5.1和JSR-223(即javax.script包),我期待Python腳本的最後一行被返回。例如,在評估此腳本之後:使用JSR-223從Jython腳本獲取數據

class Multiplier: 

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

Multiplier().multiply(5, 7) 

我應該回到35,但是我得到空值。另一方面它可以與其他測試一起使用:

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和犀牛,即總是返回的最後一行。

在此先感謝。

回答

3

更新:我實際上在我的初步答案中遺漏了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 
+0

Java代碼幾乎就是你所寫的,並且我設法按照你所做的來打印結果。我真正需要的是在調用engine.eval(f)之後得到結果,而不是僅僅打印它。對象結果=引擎。EVAL(F); – 2009-12-11 12:59:47

+0

將評估結果分配給變量,並在評估完成後從引擎中獲取它,謝謝!但是我仍然想知道爲什麼我對其他引擎的行爲不適用於Jython。我會把問題打開一段時間,也許有人知道。 – 2009-12-11 13:59:54

+0

好問題。讓我們看看是否有人有答案(我不知道)。 – 2009-12-11 14:41:32

4

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

您看到Ruby和JavaScript有所不同的原因是複合語句具有最後評估語句的值。例如,比較紅寶石:

>> (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 
2

我有同樣的問題。我寫了支持JSR223腳本庫,並已submited 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")好像你會得到值回。

+0

即使在C python中,eval(「x = 5 \ nx」)也會失敗......所以這只是我猜測的糟糕的語言特性。 – Trejkaz 2017-08-09 02:15:55