From: dperez <cra...@ya...> - 2007-08-29 08:49:30
|
Hi, One of the features I most expect is the ability to reload Jython modules on the fly. With Jython version 2.1 it only work a few times. I have a web server, and every time I change some already loaded module, I have to restart the server. With Java files I don't need to, provided I don't change the class signature. This makes the development with Jython more cumbersome, as modify and try cycle is slowed a lot. Has this improved? I cannot test it yet myself. Regards, David -- View this message in context: http://www.nabble.com/Module-reloading-tf4346489.html#a12383044 Sent from the jython-users mailing list archive at Nabble.com. |
From: <cl...@br...> - 2007-08-29 14:53:48
|
Dear David,=20 isn=B4t the module reload issue related to the Java servlet itself or the = web-server tool?=20 I=B4m using the Jython 2.2 for many web developments (servlet) under Suse= =20 Linux. For simplicity i=B4ve chosen the=20 open-source Jetty 6 web server, which is handy and very easy to manage.=20 All what I can tell about Jython language=20 that is perfect for "on-demand" developments tasks. Yes, its deploys=20 dynamically, no module reload is needed=20 even when updating the same module source. All you need to do is to press=20 the "reload" button at the=20 I-Explorer screen. This gives me a webized interface to the "Big Blue"=20 system with a touch of years 70 Basic=20 language :-)=20 Enclosed a copy of the config file: web.xml stored under the folder =20 project-path/WEB-INF: =20 <?xml version =3D '1.0' encoding =3D 'UTF-8'?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"=20 "http://java.sun.com/dtd/web-app=5F2=5F3.dtd"> <web-app> <display-name>test</display-name> <description></description> =20 <servlet>=20 <servlet-name>PyServlet</servlet-name>=20 <servlet-class>org.python.util.PyServlet</servlet-class>=20 <load-on-startup>1</load-on-startup>=20 </servlet> <servlet-mapping> <servlet-name>PyServlet</servlet-name> <url-pattern>*.py</url-pattern> </servlet-mapping> </web-app> =20 Regards,=20 Claude=20 Claude Falbriard=20 Developer=20 AMS Hortol=E2ndia / SP - Brazil=20 phone: +55 13 8117 3316 e-mail: cl...@br... dperez <cra...@ya...>=20 Sent by: jyt...@li... 08/29/2007 05:49 AM To jyt...@li... cc Subject [Jython-users] Module reloading Hi, One of the features I most expect is the ability to reload Jython modules=20 on the fly. With Jython version 2.1 it only work a few times. I have a web server, and every time I change some already loaded module, I have to restart the server. With Java files I don't need to, provided I don't change the class signature. This makes the development with Jython more cumbersome, as modify and try cycle is slowed a lot. Has this improved? I cannot test it yet myself. Regards, David --=20 View this message in context:=20 http://www.nabble.com/Module-reloading-tf4346489.html#a12383044 Sent from the jython-users mailing list archive at Nabble.com. ------------------------------------------------------------------------- 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/ =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F= =5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F Jython-users mailing list Jyt...@li... https://lists.sourceforge.net/lists/listinfo/jython-users |
From: dperez <cra...@ya...> - 2007-08-30 06:44:08
|
I'm also using Jetty, but an older version. I think this isn't an issue related with the web server, as it doesn't know anything about Jython. The reloading support for Java classes is handled by the JVM >=3D 1.4, when debugging is active (I think this is called "hot swapping"). In practice in many cases module reloading doesn't work for me. I get strange results many times, so I get used to restart the full web server.= =20 Curiously, I get more "on-demand" development with Java than with Jython. Well, let's try if 2.2 has improved this issue..... I'm impatient. claudef wrote: >=20 > Dear David,=20 >=20 > isn=C2=B4t the module reload issue related to the Java servlet itself or= the=20 > web-server tool?=20 >=20 > I=C2=B4m using the Jython 2.2 for many web developments (servlet) under= Suse=20 > Linux. For simplicity i=C2=B4ve chosen the=20 > open-source Jetty 6 web server, which is handy and very easy to manage.= =20 > All what I can tell about Jython language=20 > that is perfect for "on-demand" developments tasks. Yes, its deploys=20 > dynamically, no module reload is needed=20 > even when updating the same module source. All you need to do is to press= =20 > the "reload" button at the=20 > I-Explorer screen. This gives me a webized interface to the "Big Blue"=20 > system with a touch of years 70 Basic=20 > language :-)=20 >=20 > Enclosed a copy of the config file: web.xml stored under the folder =20 > project-path/WEB-INF: > =20 > <?xml version =3D '1.0' encoding =3D 'UTF-8'?> > <!DOCTYPE web-app PUBLIC > "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"=20 > "http://java.sun.com/dtd/web-app_2_3.dtd"> > <web-app> > <display-name>test</display-name> > <description></description> > =20 > <servlet>=20 > <servlet-name>PyServlet</servlet-name>=20 > <servlet-class>org.python.util.PyServlet</servlet-class>=20 > <load-on-startup>1</load-on-startup>=20 > </servlet> >=20 > <servlet-mapping> > <servlet-name>PyServlet</servlet-name> > <url-pattern>*.py</url-pattern> > </servlet-mapping> >=20 > </web-app> > =20 > Regards,=20 > Claude=20 >=20 >=20 > Claude Falbriard=20 > Developer=20 > AMS Hortol=C3=A2ndia / SP - Brazil=20 > phone: +55 13 8117 3316 > e-mail: cl...@br... >=20 >=20 >=20 > dperez <cra...@ya...>=20 > Sent by: jyt...@li... > 08/29/2007 05:49 AM >=20 > To > jyt...@li... > cc >=20 > Subject > [Jython-users] Module reloading >=20 >=20 >=20 >=20 >=20 >=20 >=20 > Hi, >=20 > One of the features I most expect is the ability to reload Jython modules= =20 > on > the fly. With Jython version 2.1 it only work a few times. >=20 > I have a web server, and every time I change some already loaded module, = I > have to restart the server. With Java files I don't need to, provided I > don't change the class signature. This makes the development with Jython > more cumbersome, as modify and try cycle is slowed a lot. >=20 > Has this improved? > I cannot test it yet myself. >=20 > Regards, > David > --=20 > View this message in context:=20 > http://www.nabble.com/Module-reloading-tf4346489.html#a12383044 > Sent from the jython-users mailing list archive at Nabble.com. >=20 >=20 > ------------------------------------------------------------------------- > 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 >=20 >=20 > ------------------------------------------------------------------------- > 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 >=20 >=20 --=20 View this message in context: http://www.nabble.com/Module-reloading-tf4346= 489.html#a12401382 Sent from the jython-users mailing list archive at Nabble.com. |
From: dperez <cra...@ya...> - 2007-08-30 09:58:25
|
Thanks for your suggestions. I'm using a standard Java servlet, with mixed Java and Python code. I have developed a mechanism to force a reload from an URL: http://myserver/reload/module does this: import module reload(module) and this doesn't work always :-( dimitri van der veken wrote: > > > Hi, > > I asume you are using PyServlet (or a similar construct). > As far as I could see (in jython 2.2a1) PyServlet keeps a cache of > underlying 'python servlet' files. > As long as you change something in these 'python servlet' files, this > should be detected by PyServlet, and the file is automatically refreshed. > > This mechanism does NOT detect changes to python code further away from > your entry 'python servlet'. > Due to the fact that 'PyServlet' itself is not changed , the instance of > Pyservlet stays in cache, an nothing changes. > This seemed to prohibit a dynamic development cycle. > > I have solved this for me by forcing the reload myself in a > 'baseServlet.py'. > Here follows a code snippet: > > --------------------------------------------------------------------------------------- > > from javax.servlet.http import HttpServlet > import gf.Config as config > import time > import synchronize > > > class baseServlet (HttpServlet): > > lastRemoveTime = 0 > > def doGet(self,request,response): > self.doPost (request,response) > > def doPost(self,request,response): > response.setContentType ("text/html") > > # only force reload during development > if config.developping: > self._forceReloadModules() > > # execute action in descendant > self.doProcess(request, response) > > def _forceReloadModules(self): > now = time.time() > if ((now - baseServlet.lastRemoveTime) > 1): > baseServlet.lastRemoveTime = time.time() > import sys > for modname in sys.modules.keys(): > if modname.startswith("gf.") and modname != 'gf.application': > del(sys.modules[modname]) > else: > #print " no reloading, seconds since last remove " + str(time.time() - > baseServlet.lastRemoveTime) > pass > > baseServlet._forceReloadModules = > synchronize.make_synchronized(baseServlet._forceReloadModules) > ------------------------------------------------------------------------------------------ > > I only reload when developping ( a parameter config.developping) > One action in an ajax app can give several request at almost the same > time, > so I only force the reload if the last reload is more than 1 one second in > the past. > I only reload my own application modules (modname.startswith("gf.")). > > (I also use a modified version of 'Pyservlet' to use this baseServlet, but > that > does not change the concept) > > This setup works for me. > > greetings, > Dimitri > > > -- View this message in context: http://www.nabble.com/Module-reloading-tf4346489.html#a12404034 Sent from the jython-users mailing list archive at Nabble.com. |
From: dperez <cra...@ya...> - 2007-08-30 10:22:45
|
Confirmed that Jython 2.2 doesn't work always, like in 2.1. Maybe something more than reload(module) is needed. dperez wrote: > > Thanks for your suggestions. > > I'm using a standard Java servlet, with mixed Java and Python code. > I have developed a mechanism to force a reload from an URL: > > http://myserver/reload/module does this: > > import module > reload(module) > > and this doesn't work always :-( > > > dimitri van der veken wrote: >> >> >> Hi, >> >> I asume you are using PyServlet (or a similar construct). >> As far as I could see (in jython 2.2a1) PyServlet keeps a cache of >> underlying 'python servlet' files. >> As long as you change something in these 'python servlet' files, this >> should be detected by PyServlet, and the file is automatically refreshed. >> >> This mechanism does NOT detect changes to python code further away from >> your entry 'python servlet'. >> Due to the fact that 'PyServlet' itself is not changed , the instance of >> Pyservlet stays in cache, an nothing changes. >> This seemed to prohibit a dynamic development cycle. >> >> I have solved this for me by forcing the reload myself in a >> 'baseServlet.py'. >> Here follows a code snippet: >> >> --------------------------------------------------------------------------------------- >> >> from javax.servlet.http import HttpServlet >> import gf.Config as config >> import time >> import synchronize >> >> >> class baseServlet (HttpServlet): >> >> lastRemoveTime = 0 >> >> def doGet(self,request,response): >> self.doPost (request,response) >> >> def doPost(self,request,response): >> response.setContentType ("text/html") >> >> # only force reload during development >> if config.developping: >> self._forceReloadModules() >> >> # execute action in descendant >> self.doProcess(request, response) >> >> def _forceReloadModules(self): >> now = time.time() >> if ((now - baseServlet.lastRemoveTime) > 1): >> baseServlet.lastRemoveTime = time.time() >> import sys >> for modname in sys.modules.keys(): >> if modname.startswith("gf.") and modname != 'gf.application': >> del(sys.modules[modname]) >> else: >> #print " no reloading, seconds since last remove " + str(time.time() - >> baseServlet.lastRemoveTime) >> pass >> >> baseServlet._forceReloadModules = >> synchronize.make_synchronized(baseServlet._forceReloadModules) >> ------------------------------------------------------------------------------------------ >> >> I only reload when developping ( a parameter config.developping) >> One action in an ajax app can give several request at almost the same >> time, >> so I only force the reload if the last reload is more than 1 one second >> in the past. >> I only reload my own application modules (modname.startswith("gf.")). >> >> (I also use a modified version of 'Pyservlet' to use this baseServlet, >> but that >> does not change the concept) >> >> This setup works for me. >> >> greetings, >> Dimitri >> >> >> > > -- View this message in context: http://www.nabble.com/Module-reloading-tf4346489.html#a12404350 Sent from the jython-users mailing list archive at Nabble.com. |
From: dperez <cra...@ya...> - 2007-08-30 10:59:06
|
I have looked at the source code of PyServlet, and maybe to force a full reload withouth restarting fully the server, a new PySystemState is needed. class PYSerlvet { public void reset() { interp = new PythonInterpreter(null, new PySystemState()); PySystemState sys = Py.getSystemState(); .... } } I use to used the same PySystemState and create a new PythonInterpreter each time. But now I do this: import module reload(module) Py.setSystemState(new PySystemState()); and the result is that the module is reloaded. The only side effect is that I lose all the global python variables. But if I store them in a Java object, then I mustn't lose anything.... Let's try. dperez wrote: > > Confirmed that Jython 2.2 doesn't work always, like in 2.1. > > Maybe something more than reload(module) is needed. > > > dperez wrote: >> >> Thanks for your suggestions. >> >> I'm using a standard Java servlet, with mixed Java and Python code. >> I have developed a mechanism to force a reload from an URL: >> >> http://myserver/reload/module does this: >> >> import module >> reload(module) >> >> and this doesn't work always :-( >> >> >> dimitri van der veken wrote: >>> >>> >>> Hi, >>> >>> I asume you are using PyServlet (or a similar construct). >>> As far as I could see (in jython 2.2a1) PyServlet keeps a cache of >>> underlying 'python servlet' files. >>> As long as you change something in these 'python servlet' files, this >>> should be detected by PyServlet, and the file is automatically >>> refreshed. >>> >>> This mechanism does NOT detect changes to python code further away from >>> your entry 'python servlet'. >>> Due to the fact that 'PyServlet' itself is not changed , the instance of >>> Pyservlet stays in cache, an nothing changes. >>> This seemed to prohibit a dynamic development cycle. >>> >>> I have solved this for me by forcing the reload myself in a >>> 'baseServlet.py'. >>> Here follows a code snippet: >>> >>> --------------------------------------------------------------------------------------- >>> >>> from javax.servlet.http import HttpServlet >>> import gf.Config as config >>> import time >>> import synchronize >>> >>> >>> class baseServlet (HttpServlet): >>> >>> lastRemoveTime = 0 >>> >>> def doGet(self,request,response): >>> self.doPost (request,response) >>> >>> def doPost(self,request,response): >>> response.setContentType ("text/html") >>> >>> # only force reload during development >>> if config.developping: >>> self._forceReloadModules() >>> >>> # execute action in descendant >>> self.doProcess(request, response) >>> >>> def _forceReloadModules(self): >>> now = time.time() >>> if ((now - baseServlet.lastRemoveTime) > 1): >>> baseServlet.lastRemoveTime = time.time() >>> import sys >>> for modname in sys.modules.keys(): >>> if modname.startswith("gf.") and modname != 'gf.application': >>> del(sys.modules[modname]) >>> else: >>> #print " no reloading, seconds since last remove " + str(time.time() >>> - baseServlet.lastRemoveTime) >>> pass >>> >>> baseServlet._forceReloadModules = >>> synchronize.make_synchronized(baseServlet._forceReloadModules) >>> ------------------------------------------------------------------------------------------ >>> >>> I only reload when developping ( a parameter config.developping) >>> One action in an ajax app can give several request at almost the same >>> time, >>> so I only force the reload if the last reload is more than 1 one second >>> in the past. >>> I only reload my own application modules (modname.startswith("gf.")). >>> >>> (I also use a modified version of 'Pyservlet' to use this baseServlet, >>> but that >>> does not change the concept) >>> >>> This setup works for me. >>> >>> greetings, >>> Dimitri >>> >>> >>> >> >> > > -- View this message in context: http://www.nabble.com/Module-reloading-tf4346489.html#a12404782 Sent from the jython-users mailing list archive at Nabble.com. |