From: Johann P. <joh...@ch...> - 2007-08-06 08:37:02
|
I try to embed jython using the jsr223 scripting engine interface (using java 6 on Linux for this). This is part of an attempt to add several scripting engines to my application in a consistent way, and I have so far gotten the jruby, groovy, and javascript engines to work. However, with the jython engine, there is the following problem: Unlike with the other engines, evaluating an expression always returns null. Here is a rough outline of what I do (removed error checking etc.): ScriptEngineManager scriptEngineManager = new ScriptEngineManager(myOwnClassLoader); // this returns non-null: scriptEngine = scriptEngineManager.getEngineByName("jython"); // .... Object value = scriptEngine.eval(command); If command is e.g. "print 1" then 1 appears on standard output, so the scripting engine works somehow. However, variable value always contains null. When command is e.g. 1 + 1 or "asdf"+"asdf", value should contain the evaluated expression but still contains null. I am using exactly the same code as for other scripting engines, which all return the correct value. However, the jython engine always return null. Any ideas what could be wrong here? |
From: Frank C. <fc...@pu...> - 2007-08-06 18:37:23
|
Hi Johann: We embed JSR 223 and Jython support in PushToTest TestMaker (http://www.pushtotest.com). We did not encounter the problem you mentioned when calling Jython 2.1 through the JSR 223 ScriptEngine API. I thought you should know about a problem you are bound to encounter. When we define a class in Jython, we were not able to obtain an instance of it from Java. That is, someone in the Jython script must instantiate the class and return the object reference. We work around this problem by requiring the Jython scripts to include a getXXXX() method that instantiates and returns the object reference. Why so? Because the interpreter simply interprets the script, and there is nothing directly executable, but just declarations. In this particular case, "print 1" is an executable line, so it will execute. The line "1 + 1" also executes, but the eval() method returns an object. It may be that Jython is evaluating the addition but is not returning the value (since it is not being assigned), thus the engine returns null. Try "a = 1 + 1" instead. In this case, the addition is actually going into a variable, that may be returned. You may also note that it may return an integer, that must be translated into a Java object. That I don't know if Jython library supports it. Hope this helps. -Frank (and William) On Aug 6, 2007, at 1:36 AM, Johann Petrak wrote: > I try to embed jython using the jsr223 scripting engine interface > (using java 6 on Linux for this). > > This is part of an attempt to add several scripting engines to my > application in a consistent way, and I have so far gotten the jruby, > groovy, and javascript engines to work. > > However, with the jython engine, there is the following problem: > Unlike with the other engines, evaluating an expression always > returns null. > > Here is a rough outline of what I do (removed error checking etc.): > > ScriptEngineManager scriptEngineManager = > new ScriptEngineManager(myOwnClassLoader); > // this returns non-null: > scriptEngine = scriptEngineManager.getEngineByName("jython"); > > // .... > > Object value = scriptEngine.eval(command); > > If command is e.g. "print 1" then 1 appears on standard output, so > the scripting engine works somehow. > > However, variable value always contains null. > > When command is e.g. 1 + 1 or "asdf"+"asdf", value should contain > the evaluated expression but still contains null. > > I am using exactly the same code as for other scripting engines, which > all return the correct value. However, the jython engine always > return null. > > Any ideas what could be wrong here? > > ---------------------------------------------------------------------- > --- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a > browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users > -- Frank Cohen, PushToTest, http://www.PushToTest.com, phone 408 374 7426 TestMaker: The open-source SOA test automation tool |
From: Dave K. <dku...@re...> - 2007-08-06 20:41:56
|
Frank Cohen <fcohen <at> pushtotest.com> writes: > Why so? Because the interpreter simply interprets the script, and > there is nothing directly executable, but just declarations. In this > particular case, "print 1" is an executable line, so it will execute. > The line "1 + 1" also executes, but the eval() method returns an > object. It may be that Jython is evaluating the addition but is not > returning the value (since it is not being assigned), thus the engine > returns null. Try "a = 1 + 1" instead. In this case, the addition is > actually going into a variable, that may be returned. You may also > note that it may return an integer, that must be translated into a > Java object. That I don't know if Jython library supports it. A few of points: 1. Statements in Python/Jython do not "return" values. So you cannot write: x = (a = 1 + 1) So, neither "a = 1 + 1" nor "print 1" *should* return a value. Expressions return values 2. org.python.uil.PythonIntrpreter.eval(String s) returns a value of type PyObject, not Object. I don't know whether that might make a difference. 3. If the statement you are executing is an assignment statement, then you might try getting the value by accessing the namespace in which the statement runs. For example: interp.exec("a = 1 + 1"); PyObject obj = interp.get("a"); > > Hope this helps. Likewise. Dave |
From: Oti <oh...@gm...> - 2007-08-06 21:29:10
|
Hi, from https://scripting.dev.java.net/source/browse/scripting/engines/jython/src/com/sun/script/jython/JythonScriptEngine.java?rev=1.4&view=markup you can see the following comment: /* * Jython parser seems to have 3 input modes (called compile "kind") * These are "single", "eval" and "exec". I don't clearly understand * the difference. But, with "eval" and "exec" certain features are * not working. For eg. with "eval" assignments are not working. * I've used "exec". But, that is customizable by special attribute. */ I suppose you could force 'eval' if you have a real expression, but I never tried that. What I have tried is to get instances back. See the JyClass.forScript() / newInstance() here: http://jython.extreme.st/talk/talk.html The code for JyClass can be found here: http://jython.extreme.st/downloads/downloads.html, in example-src.zip. There you can also find a working JSR223 scripting engine embedding example, running on JDK 1.6. Please let me know if it does not work for you. best wishes, Oti. On 8/6/07, Dave Kuhlman <dku...@re...> wrote: > Frank Cohen <fcohen <at> pushtotest.com> writes: > > > Why so? Because the interpreter simply interprets the script, and > > there is nothing directly executable, but just declarations. In this > > particular case, "print 1" is an executable line, so it will execute. > > The line "1 + 1" also executes, but the eval() method returns an > > object. It may be that Jython is evaluating the addition but is not > > returning the value (since it is not being assigned), thus the engine > > returns null. Try "a = 1 + 1" instead. In this case, the addition is > > actually going into a variable, that may be returned. You may also > > note that it may return an integer, that must be translated into a > > Java object. That I don't know if Jython library supports it. > > A few of points: > > 1. Statements in Python/Jython do not "return" values. So you cannot write: > > x = (a = 1 + 1) > > So, neither "a = 1 + 1" nor "print 1" *should* return a value. > > Expressions return values > > 2. org.python.uil.PythonIntrpreter.eval(String s) returns a value of type > PyObject, not Object. I don't know whether that might make a difference. > > 3. If the statement you are executing is an assignment statement, then you > might try getting the value by accessing the namespace in which the statement > runs. For example: > > interp.exec("a = 1 + 1"); > PyObject obj = interp.get("a"); > > > > > > Hope this helps. > > Likewise. > > Dave > > > > > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users > |
From: Johann P. <joh...@ch...> - 2007-08-09 11:16:30
|
Hi, thanks for helping me here! Oti wrote: > Hi, > > from > https://scripting.dev.java.net/source/browse/scripting/engines/jython/src/com/sun/script/jython/JythonScriptEngine.java?rev=1.4&view=markup > you can see the following comment: > > /* > * Jython parser seems to have 3 input modes (called compile "kind") > * These are "single", "eval" and "exec". I don't clearly understand > * the difference. But, with "eval" and "exec" certain features are > * not working. For eg. with "eval" assignments are not working. > * I've used "exec". But, that is customizable by special attribute. > */ > > I suppose you could force 'eval' if you have a real expression, but I > never tried that. > I am not entirely sure how I would have to do this in my application. Given my current code (that is essentially identical for all scripting languages I have embedded in my application): ScriptEngineManager scriptEngineManager = new ScriptEngineManager(myOwnClassLoader); // this returns non-null: scriptEngine = scriptEngineManager.getEngineByName("jython"); // .... Object value = scriptEngine.eval(command); ... what would I have to add to force "eval" mode of the Jython parser for evaluating command? > What I have tried is to get instances back. See the > JyClass.forScript() / newInstance() here: > http://jython.extreme.st/talk/talk.html > The code for JyClass can be found here: > http://jython.extreme.st/downloads/downloads.html, I am afraid I do not really understand how this relates to scriptEngine.eval() I must admit that I essentially just followed boilerplate instructions of how to get scripting engines to work so far and it turned out that was successful with JRuby, Groovy, and JavaScript. My application essentially should allow the use of one of several scripting languages in a console and this is done by creating the apropriate scripting engine with getEngineByName and then using this in a GUI that simulates an interactive shell. All scripting languages are supposed to use scriptEngine and work in roughly the same way. So -- I am still not sure if it is possible to achive this with the Jython engine. I would have loved to support Jython for those who like the language (though I am not a P/Jython programmer myself), but if this cannot be done in roughly the same way as with JRuby, JavaScript, or Groovy, I guess I will just not include Jython for now. Thanks for your valuable feedback! Johann |
From: Johann P. <joh...@ch...> - 2007-08-09 08:51:45
|
Frank Cohen wrote: > Hi Johann: We embed JSR 223 and Jython support in PushToTest TestMaker > (http://www.pushtotest.com). We did not encounter the problem you > mentioned when calling Jython 2.1 through the JSR 223 ScriptEngine API. > > I thought you should know about a problem you are bound to encounter. > When we define a class in Jython, we were not able to obtain an instance > of it from Java. That is, someone in the Jython script must instantiate > the class and return the object reference. We work around this problem > by requiring the Jython scripts to include a getXXXX() method that > instantiates and returns the object reference. > > Why so? Because the interpreter simply interprets the script, and there > is nothing directly executable, but just declarations. In this > particular case, "print 1" is an executable line, so it will execute. > The line "1 + 1" also executes, but the eval() method returns an object. > It may be that Jython is evaluating the addition but is not returning > the value (since it is not being assigned), thus the engine returns > null. Try "a = 1 + 1" instead. In this case, the addition is actually > going into a variable, that may be returned. You may also note that it > may return an integer, that must be translated into a Java object. That > I don't know if Jython library supports it. > This describes the symptom, but I am still puzzled about why this is the case? I thought the point of eval("1+1") is exactly to *evaluate* and return the result of this expresion. What is worse is that eval("a = 1 + 1") might assign the result of "1+1" to a but eval("a") still does not return the value of a but null. No other scripting engine I have tried shows the same symptom and this behavior makes it really hard to embed Jython as a shell within my application. I was simply expecting this to 1) behave like all other embedded shells and 2) like what happens when I run "python" or "idle" -- in both cases the value of evaluating an expression is returned back to the user. The eval function is *designed* to return an object that is the result of evaluating the expresion -- so I really puzzled: is this a bug that I can hope to get solved? |
From: Frank C. <fc...@pu...> - 2007-08-09 14:49:42
|
Hi Johann: The eval() method in Jython is not simply an expression evaluator, it should more appropriately be called run(). eval() will run the script and it is up to the script to return a result. eval ("print 1+1") and eval("print 'a'") will always return a value. -Frank On Aug 9, 2007, at 1:51 AM, Johann Petrak wrote: > Frank Cohen wrote: >> Hi Johann: We embed JSR 223 and Jython support in PushToTest >> TestMaker >> (http://www.pushtotest.com). We did not encounter the problem you >> mentioned when calling Jython 2.1 through the JSR 223 ScriptEngine >> API. >> >> I thought you should know about a problem you are bound to encounter. >> When we define a class in Jython, we were not able to obtain an >> instance >> of it from Java. That is, someone in the Jython script must >> instantiate >> the class and return the object reference. We work around this >> problem >> by requiring the Jython scripts to include a getXXXX() method that >> instantiates and returns the object reference. >> >> Why so? Because the interpreter simply interprets the script, and >> there >> is nothing directly executable, but just declarations. In this >> particular case, "print 1" is an executable line, so it will execute. >> The line "1 + 1" also executes, but the eval() method returns an >> object. >> It may be that Jython is evaluating the addition but is not returning >> the value (since it is not being assigned), thus the engine returns >> null. Try "a = 1 + 1" instead. In this case, the addition is actually >> going into a variable, that may be returned. You may also note >> that it >> may return an integer, that must be translated into a Java object. >> That >> I don't know if Jython library supports it. >> > > This describes the symptom, but I am still puzzled about why this > is the > case? I thought the point of eval("1+1") is exactly to *evaluate* and > return the result of this expresion. > What is worse is that eval("a = 1 + 1") might assign the result of > "1+1" to a but eval("a") still does not return the value of a but > null. No other scripting engine I have tried shows the same symptom > and this behavior makes it really hard to embed Jython as a shell > within my application. > > I was simply expecting this to 1) behave like all other embedded > shells > and 2) like what happens when I run "python" or "idle" -- in both > cases > the value of evaluating an expression is returned back to the user. > > The eval function is *designed* to return an object that is the result > of evaluating the expresion -- so I really puzzled: is this a bug that > I can hope to get solved? > > ---------------------------------------------------------------------- > --- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a > browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users > -- Frank Cohen, PushToTest, http://www.PushToTest.com, phone 408 374 7426 TestMaker: The open-source SOA test automation tool |