2009-06-16 20 views
2

Lorsque vous démarrez/arrêtez un service python cherrypy (compilé avec py2exe), cela fonctionne correctement Lorsque j'obtiens un appel sys.exit() (depuis mon gestionnaire d'erreurs), cherrypy se ferme, mais le service reste actif pendaison.Gérer sys.exit() dans le service cherrypy

code:

import cherrypy 
import win32serviceutil 
import win32service 
import sys 

SERVICE = None 

class HelloWorld: 
    """ Sample request handler class. """ 

    def __init__(self): 
     self.iVal = 0 

    @cherrypy.expose 
    def index(self): 
     self.iVal += 1 
     if self.iVal == 5: 
      StopService(SERVICE) 
     return "Hello world! " + str(self.iVal) 


class MyService(win32serviceutil.ServiceFramework): 
    """NT Service.""" 

    _svc_name_ = "CherryPyService" 
    _svc_display_name_ = "CherryPy Service" 
    _svc_description_ = "Some description for this service" 

    def SvcDoRun(self): 
     SERVICE = self 
     StartService() 


    def SvcStop(self): 
     StopService(SERVICE) 


def StartService(): 

    cherrypy.tree.mount(HelloWorld(), '/') 

    cherrypy.config.update({ 
     'global':{ 
      'tools.log_tracebacks.on': True, 
      'log.error_file': '\\Error_File.txt', 
      'log.screen': True, 
      'engine.autoreload.on': False, 
      'engine.SIGHUP': None, 
      'engine.SIGTERM': None 
      } 
     }) 

    cherrypy.engine.start() 
    cherrypy.engine.block() 


def StopService(classObject): 
    classObject.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
    cherrypy.engine.exit() 
    classObject.ReportServiceStatus(win32service.SERVICE_STOPPED) 



if __name__ == '__main__': 
    print sys.argv 
    win32serviceutil.HandleCommandLine(MyService) 

Tout conseil serait génial :)

Répondre

2

Je ne suis pas tout à fait sûr où l'appel sys.exit vient ou ce que votre comportement est préféré. Lorsque sys.exit est appelé, cependant, il déclenche une exception SystemExit. Vous pouvez intercepter cela et continuer sur votre chemin:

import sys 
try: 
    sys.exit() 
except SystemExit: 
    print "Somebody called sys.exit()." 
print "Still running." 

... ou utilisez finally pour procéder à un nettoyage:

try: 
    do_something() 
finally: 
    cleanup()