From: Fernando <fer...@cm...> - 2015-05-11 10:17:31
|
Hi, I have a (internal) web app based on zope that uses many python scripts (essentially a function). I am considering the porting of this application to Tomcat/Jython using pyservlet. In fact, there will be only one pyservlet which gets all requests and processes them according to type, one of this being a python script. In Python, I could use the following code to process this scripts: >>> f = file('dateGetYmd') # the script file, which has a namesake function >>> obj = compile(f.read(), '', 'exec') >>> marshal.dump(obj, fc) >>> exec obj >>> dateGetYmd('0') # this function call will also access local objects Would this work in Jython? docs would say so, but is there any caveats? and what about performance? what does compile return? (python byte codes?) Or is there a better way to do it? Regards, Fernando Martins |
From: Fernando <fer...@cm...> - 2015-05-11 12:34:04
|
fyi, when I try marshal.load(f), in the jyton 2.7 prompt, I get ValueError: bad marshal data On 11 May 2015, Fernando <fer...@cm...> wrote: > Hi, > > I have a (internal) web app based on zope that uses many python scripts (essentially a function). > > I am considering the porting of this application to Tomcat/Jython using pyservlet. In fact, there will be only one pyservlet which gets all requests and processes them according to type, one of this being a python script. > > In Python, I could use the following code to process this scripts: > > >>> f = file('dateGetYmd') # the script file, which has a namesake function > >>> obj = compile(f.read(), '', 'exec') > >>> marshal.dump(obj, fc) > >>> exec obj > >>> dateGetYmd('0') # this function call will also access local objects > > Would this work in Jython? docs would say so, but is there any caveats? > > and what about performance? what does compile return? (python byte codes?) > > Or is there a better way to do it? > > Regards, > Fernando Martins > > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > <http://ad.doubleclick.net/ddm/clk/290420510;117567292;y> > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > <https://lists.sourceforge.net/lists/listinfo/jython-users> > |
From: Fernando <fer...@cm...> - 2015-05-11 14:15:49
|
this looks like a bug, should I report it elsewhere? also, any alternative to marshal? On 11 May 2015, Fernando <fer...@cm...> wrote: > fyi, when I try marshal.load(f), in the jyton 2.7 prompt, I get > > ValueError: bad marshal data > > > On 11 May 2015, Fernando <fer...@cm...> wrote: > > Hi, > > > > I have a (internal) web app based on zope that uses many python scripts (essentially a function). > > > > I am considering the porting of this application to Tomcat/Jython using pyservlet. In fact, there will be only one pyservlet which gets all requests and processes them according to type, one of this being a python script. > > > > In Python, I could use the following code to process this scripts: > > > > >>> f = file('dateGetYmd') # the script file, which has a namesake function > > >>> obj = compile(f.read(), '', 'exec') > > >>> marshal.dump(obj, fc) > > >>> exec obj > > >>> dateGetYmd('0') # this function call will also access local objects > > > > Would this work in Jython? docs would say so, but is there any caveats? > > > > and what about performance? what does compile return? (python byte codes?) > > > > Or is there a better way to do it? > > > > Regards, > > Fernando Martins > > > > ------------------------------------------------------------------------------ > > One dashboard for servers and applications across Physical-Virtual-Cloud > > Widest out-of-the-box monitoring support with 50+ applications > > Performance metrics, stats and reports that give you Actionable Insights > > Deep dive visibility with transaction tracing using APM Insight. > > <http://ad.doubleclick.net/ddm/clk/290420510;117567292;y> > > > > _______________________________________________ > > Jython-users mailing list > > Jyt...@li... > > <https://lists.sourceforge.net/lists/listinfo/jython-users> > > > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > <http://ad.doubleclick.net/ddm/clk/290420510;117567292;y> > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > <https://lists.sourceforge.net/lists/listinfo/jython-users> > |
From: Alan K. <jyt...@xh...> - 2015-05-11 12:51:55
|
[Fernando] > >>> f = file('dateGetYmd') # the script file, which has a namesake function > >>> obj = compile(f.read(), '', 'exec') > >>> marshal.dump(obj, fc) > >>> exec obj > >>> dateGetYmd('0') # this function call will also access local objects > Would this work in Jython? docs would say so, but is there any caveats? There should no problem with this. Obviously, the file containing the source must be acessible to the servlet context you are running it from. You could execute the jython source listed above directly in an embedded jython interpreter, meaning you would represent it as a string, and pass it to the 'exec' method of a org.python.util.PythonInterpreter. Or you could figure out the equivalent java calls, and invoke them directly from java. PyServlet gives a good example of how to write all the relevant code, in java. I would use 'execfile' instead of 'compile', which applies to both java code and jython. Here is where PyServlet does it https://hg.python.org/jython/file/6855fa289d48/src/org/python/util/PyServlet.java#l208 > and what about performance? what does compile return? (python byte codes?) Compile (and exec and execfile) return JVM bytecode representing the jython source. The performance of running this code in an embedded context should be the same as running in a non-embedded context. > Or is there a better way to do it? Not necessarily better, but an alternative to using PyServlet is to use modjy, which would give you WSGI compatibility, and better configurability. Alan. |
From: Fernando <fer...@cm...> - 2015-05-11 14:14:50
|
On 11 May 2015, Alan Kennedy <jyt...@xh...> wrote: > [Fernando] > > >>> f = file('dateGetYmd') # the script file, which has a namesake function > > >>> obj = compile(f.read(), '', 'exec') > > >>> marshal.dump(obj, fc) > > >>> exec obj > > >>> dateGetYmd('0') # this function call will also access local objects > > > Would this work in Jython? docs would say so, but is there any caveats? > > There should no problem with this. Obviously, the file containing the source must be acessible to the servlet context you are running it from. > > You could execute the jython source listed above directly in an embedded jython interpreter, meaning you would represent it as a string, and pass it to the 'exec' method of a org.python.util.PythonInterpreter. > > I am using pyservlet to call my own jython servlet and in here I would run the code above. I don't see the need for extra interpreters, right? > Or you could figure out the equivalent java calls, and invoke them directly from java. > > PyServlet gives a good example of how to write all the relevant code, in java. > > I would use 'execfile' instead of 'compile', which applies to both java code and jython. Here is where PyServlet does it > > <https://hg.python.org/jython/file/6855fa289d48/src/org/python/util/PyServlet.java#l208> > > thks, I looked at it already but I don't have experience with java and its libraries. If I get a decently working solution then I could look into porting my jython servlet to java, but I am really not looking forward to it. For now I am merely seeing if there is any major roadblock. The reason for 'compile' is to persist the byte code for a quicker startup. Sadly, marshall in jython does not seem to be working well. > > and what about performance? what does compile return? (python byte codes?) > > Compile (and exec and execfile) return JVM bytecode representing the jython source. The performance of running this code in an embedded context should be the same as running in a non-embedded context. > > > Or is there a better way to do it? > > Not necessarily better, but an alternative to using PyServlet is to use modjy, which would give you WSGI compatibility, and better configurability. > > Alan. > > Thanks for your extensice feedback Alan! |
From: Alan K. <jyt...@xh...> - 2015-05-11 14:33:59
|
[Fernando] > I am using pyservlet to call my own jython servlet and in here > I would run the code above. I don't see the need for extra > interpreters, right? PythonInterpreter are really just thin wrappers around a PySystemState. PySystemState is the object that varies the interpreter environment, such as modules loaded, search paths, etc. So one Interpretet should be just fine. [Fernando] > thks, I looked at it already but I don't have experience > with java and its libraries. If I get a decently working > solution then I could look into porting my jython servlet > to java, but I am really not looking forward to it. > For now I am merely seeing if there is any major roadblock. I see no major roadblocks. As for experience with java, you may find the java component of modjy a lot simpler to understand than PyServlet: it does all of the key things you need to do, but in a lot less code, and is much easier to read. https://hg.python.org/jython/file/376c6130d9e8/src/com/xhaus/modjy/ModjyJServlet.java [Fernando] > The reason for 'compile' is to persist the byte code for a quicker startup. > Sadly, marshall in jython does not seem to be working well. If you import your code from a module instead of exec'ing it, and the process you're executing has write permission on the directory containing the imported module, jython will cache the JVM bytecode for your module, to speed up future execution. For example, if your code is in "mymodule.py", when you "import mymodule", the JVM bytecode will be stored in a file called "mymodule$py.class" in the same directory. You can see this in action by simply importing a module from the command line interpreter. Alan. |
From: Fernando <fer...@cm...> - 2015-05-11 16:48:38
|
'import' is not so practical or nice. I have plenty of scripts in many directories, I don't want to litter them with __init__.py plus all the compiled files. I would prefer a single cache folder. So far pyservlet seems enough for me, all I need is the doPost method. I'll look into modjy but I don't fully get WSGI. How does modjy know which is the app to be called? And can modjy keep an app loaded all the time waiting for requests? On 11 May 2015, Alan Kennedy <jyt...@xh...> wrote: > [Fernando] > > I am using pyservlet to call my own jython servlet and in here > > I would run the code above. I don't see the need for extra > > interpreters, right? > > PythonInterpreter are really just thin wrappers around a PySystemState. PySystemState is the object that varies the interpreter environment, such as modules loaded, search paths, etc. So one Interpretet should be just fine. > > [Fernando] > > thks, I looked at it already but I don't have experience > > with java and its libraries. If I get a decently working > > solution then I could look into porting my jython servlet > > to java, but I am really not looking forward to it. > > For now I am merely seeing if there is any major roadblock. > > I see no major roadblocks. > > As for experience with java, you may find the java component of modjy a lot simpler to understand than PyServlet: it does all of the key things you need to do, but in a lot less code, and is much easier to read. > > <https://hg.python.org/jython/file/376c6130d9e8/src/com/xhaus/modjy/ModjyJServlet.java> > > [Fernando] > > The reason for 'compile' is to persist the byte code for a quicker startup. > > Sadly, marshall in jython does not seem to be working well. > > If you import your code from a module instead of exec'ing it, and the process you're executing has write permission on the directory containing the imported module, jython will cache the JVM bytecode for your module, to speed up future execution. > > For example, if your code is in "mymodule.py", when you "import mymodule", the JVM bytecode will be stored in a file called "mymodule$py.class" in the same directory. > > You can see this in action by simply importing a module from the command line interpreter. > > Alan. > > |
From: Alan K. <jyt...@xh...> - 2015-05-11 17:05:49
|
[Fernando] > I'll look into modjy but I don't fully get WSGI. How does modjy know which is the app to be called? There are two different ways to configure it, both documented here http://opensource.xhaus.com/projects/modjy/wiki/ModjyLocateCallables [Fernando] > And can modjy keep an app loaded all the time waiting for requests? Yes, that's the whole point of modjy. And of PyServlet. And of java servlets in general. An object is created, and used to service every request. In WSGI and modjy terms, this object is a WSGI application object, which is 'call'ed, with the WSGI environment representing the request passed as a parameter. The object is 'call'ed once for every incoming request. In java servlet terms, the servlet container invokes the 'service' method of the object, with a HttpServletRequest object as a parameter. The latter gives the servlet all the information it needs to know to service the request. The method is called once for every request. In both cases, multiple requests can be served simultaneously, in different threads. Thread creation is under the control of the servlet container. Alan. |