Служба pywin32 Windows не хочет отправлять статус запроса - PullRequest
0 голосов
/ 25 октября 2018

У меня есть сервер Python, сделанный из HTTPServer.И я хочу использовать этот сервер в качестве службы Windows:

Вот как выглядит сервер:

class Handler(BaseHTTPRequestHandler):

        def do_GET(self):
            self.send_response(200)
            self.wfile.write(bytes("Hi, guys.", "utf8"))


class Server:
    def __init__(self, host, port):
        self.http_server = HTTPServer((host, port), Handler)
        self.thread = threading.Thread(target=self.http_server.serve_forever)

    def start(self):
        self.thread.start()

    def stop(self):
        self.http_server.shutdown()
        self.thread.join()

    @staticmethod
    def do_job():
        do_some_staff_here()
        time.sleep(1)

Итак, все очень просто.Для создания службы Windows я использую pywin32.Давайте посмотрим на мой код:

 class AppServerSvc(win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "TestService"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.stop_requested = False

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.stop_requested = True

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()

    def main(self):
        server = Server("", 8080)
        server.start()
        while not self.stop_requested:
            server.do_job()
        server.stop()


if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

И есть некоторые проблемы:

  • В обычном «сервисном» режиме (когда я включаю его через настольное приложение),если я пытаюсь открыть эту страницу, она не отвечает.В режиме отладки все работает нормально.
  • Когда я удаляю self.send_response(200), служба начинает нормально работать в обоих режимах.

Итак, что может быть причиной такого поведения?

ОБНОВЛЕНИЕ

Я получаю следующую ошибку, когда пытаюсь выполнить send_response():

'NoneType'объект не имеет атрибута "запись"

...