Hi Jose, That's great. My application was running under "paster serve" but was failing as a Windows service; a quick look at the application logs in event viewer as you suggested highlighted the problem as an ImportError which I fixed and it works perfectly now.
Would you be willing to post your code to the Wiki and write a short article at http://pylonshq.com/project for others who don't read the mailing list? Many thanks, James Jose Galvez wrote: > Also win32all must be install, but I'm assuming that it is > Jose > > James Gardner wrote: > >> Hi Jose, >> >> An application like this would be extremely helpful and would be great >> to include in Pylons with a bit of tweaking but I just can't quite get >> it working on my machine. I can successfully update my INI file and then >> install a service without errors but no application appears to actually >> run when I start the installed service, there are no Python applications >> in Task Manager for example. Which port does the application run on? Is >> there a step I'm missing? >> >> Best wishes, >> >> James >> >> >> jose wrote: >> >> >>> I've been playing around with pylons lately on windows and saw that >>> there >>> is no equivalent to demonize in paste for windows. So after looking >>> around at >>> lots of code I stole and modified some example windows service code >>> from cherrypy. Basically if you put the windowservice.py fine in the >>> same file as your inifile, and run it it will add a new section to the >>> ini file which will allow you to define a windows service, running it >>> again a second time will allow you to install, and run the newly >>> defined service. I'm including the file, hopefully someone else will >>> find it useful, and if anyone has suggestions on how to improve the >>> spaghetti code It would be much appreciated. >>> >>> Jose >>> >>> >>> === WindowsService.py ==== >>> >>> """ >>> The most basic (working) Windows service possible. >>> Requires Mark Hammond's pywin32 package. >>> Most of the code was taken from a CherryPy 2.2 example of how to set >>> up a service >>> """ >>> >>> import win32serviceutil >>> from paste.script.serve import ServeCommand as Server >>> import os, sys >>> import ConfigParser >>> >>> import win32service >>> import win32event >>> >>> class DefaultSettings(object): >>> def __init__(self): >>> os.chdir(os.path.dirname(__file__)) >>> # find the ini file >>> self.ini = [x for x in os.listdir('.') >>> if os.path.splitext(x)[1].lower().endswith('ini')] >>> # create a config parser opject and populate it with the ini >>> file >>> c = ConfigParser.SafeConfigParser() >>> c.read(self.ini[0]) >>> self.c = c >>> >>> def getDefaults(self): >>> ''' >>> Check for and get the default settings >>> ''' >>> if ( >>> (not self.c.has_section('winservice')) or >>> (not self.c.has_option('winservice', 'service_name')) or >>> (not self.c.has_option('winservice', >>> 'service_display_name')) or >>> (not self.c.has_option('winservice', >>> 'service_description')) >>> ): >>> print 'setting defaults' >>> self.setDefaults() >>> service_name = self.c.get('winservice', 'service_name') >>> service_display_name = self.c.get('winservice', >>> 'service_display_name') >>> service_description = self.c.get('winservice', >>> 'service_description') >>> iniFile = self.ini[0] >>> return service_name, service_display_name, service_description, >>> iniFile >>> >>> def setDefaults(self): >>> ''' >>> set and add the default setting to the ini file >>> ''' >>> if not self.c.has_section('winservice'): >>> self.c.add_section('winservice') >>> self.c.set('winservice', 'service_name', 'WSCGIService') >>> self.c.set('winservice', 'service_display_name', 'WSCGI windows >>> service') >>> self.c.set('winservice', 'service_description', 'WSCGI windows >>> service') >>> cfg = file(self.ini[0], 'wr') >>> self.c.write(cfg) >>> cfg.close() >>> print ''' >>> you must set the winservice section service_name, service_display_name, >>> and service_description options to define the service >>> in the %s file >>> ''' % self.ini[0] >>> sys.exit() >>> >>> >>> class MyService(win32serviceutil.ServiceFramework): >>> """NT Service.""" >>> >>> d = DefaultSettings() >>> service_name, service_display_name, service_description, iniFile = >>> d.getDefaults() >>> >>> _svc_name_ = service_name >>> _svc_display_name_ = service_display_name >>> _svc_description_ = service_description >>> >>> def __init__(self, args): >>> win32serviceutil.ServiceFramework.__init__(self, args) >>> # create an event that SvcDoRun can wait on and SvcStop >>> # can set. >>> self.stop_event = win32event.CreateEvent(None, 0, 0, None) >>> >>> def SvcDoRun(self): >>> os.chdir(os.path.dirname(__file__)) >>> s = Server(None) >>> s.run([self.iniFile]) >>> win32event.WaitForSingleObject(self.stop_event, >>> win32event.INFINITE) >>> >>> def SvcStop(self): >>> self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) >>> #cherrypy.server.stop() >>> #win32event.SetEvent(self.stop_event) >>> self.ReportServiceStatus(win32service.SERVICE_STOPPED) >>> sys.exit() >>> >>> if __name__ == '__main__': >>> win32serviceutil.HandleCommandLine(MyService) >>> >>> ========================================== >>> >>> >>> >>> >>> >>> >> >> >> > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "pylons-discuss" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/pylons-discuss -~----------~----~----~----~------~----~------~--~---
