Ручка sys.exit () в сервисе cherrypy

Когда вы запускаете / останавливаете сервис python cherrypy (скомпилированный с py2exe), это отлично работает. Когда я получаю sys.exit()вызов (из моего обработчика ошибок), cherrypy завершает работу, но служба остается зависающей.

Код:

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)

Любой совет будет полезен :)

python,windows-services,cherrypy,

2

Ответов: 2


2 принят

Я не совсем уверен, откуда sys.exitидет звонок или что вы предпочитаете. Однако при sys.exitвызове он вызывает SystemExitисключение. Вы можете перехватить это и продолжить свой путь:

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

... или использовать finallyдля некоторой очистки:

try:
    do_something()
finally:
    cleanup()

1

cherrypy.engine.exit()вместо того, чтобы останавливать сервер Cherrypy поверх http рекомендует sys.exit().

питон, окна-услуги, CherryPy,
Похожие вопросы