Создание службы Windows с использованием Python

Введение

Примеры

  • Скрипт Python, который можно запустить как сервис

    Модули , используемые в данном примере , являются частью pywin32 (Python для расширений Windows). В зависимости от того, как вы установили Python, вам может потребоваться установить его отдельно.

    import win32serviceutil
    import win32service
    import win32event
    import servicemanager
    import socket
    
    
    class AppServerSvc (win32serviceutil.ServiceFramework):
        _svc_name_ = "TestService"
        _svc_display_name_ = "Test Service"
    
        def __init__(self,args):
            win32serviceutil.ServiceFramework.__init__(self,args)
            self.hWaitStop = win32event.CreateEvent(None,0,0,None)
            socket.setdefaulttimeout(60)
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            win32event.SetEvent(self.hWaitStop)
    
        def SvcDoRun(self):
            servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                                  servicemanager.PYS_SERVICE_STARTED,
                                  (self._svc_name_,''))
            self.main()
    
        def main(self):
            pass
    
    if __name__ == '__main__':
        win32serviceutil.HandleCommandLine(AppServerSvc)
    
    
    

    Это просто шаблон. Код вашего приложения, вероятно, вызывающий отдельный скрипт, будет идти в функцию main ().

    Вам также нужно будет установить это как сервис. Лучшее решение для этого в данный момент , как представляется, использовать Non-сосущий Service Manager . Это позволяет установить службу и предоставляет графический интерфейс для настройки командной строки, которую выполняет служба. Для Python вы можете сделать это, что создает сервис за один раз:

     nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
    
     

    Где my_script.py - это приведенный выше шаблон сценария, измененный для вызова сценария приложения или кода в функции main (). Обратите внимание, что сервис не запускает скрипт Python напрямую, он запускает интерпретатор Python и передает ему основной скрипт в командной строке.

    В качестве альтернативы вы можете использовать инструменты, предоставленные в Windows Server Resource Kit для вашей версии операционной системы, поэтому создайте службу.

  • Запуск веб-приложения Flask в качестве службы

    Это вариант общего примера. Вам просто нужно импортировать приложение сценарий и вызвать это run() метод в сервисе main() функции. В этом случае мы также используем многопроцессорной модуль из - за проблемы с доступом WSGIRequestHandler .

     import win32serviceutil
    import win32service
    import win32event
    import servicemanager
    from multiprocessing import Process
    
    from app import app
    
    
    class Service(win32serviceutil.ServiceFramework):
        _svc_name_ = "TestService"
        _svc_display_name_ = "Test Service"
        _svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe"
    
        def __init__(self, *args):
            super().__init__(*args)
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            self.process.terminate()
            self.ReportServiceStatus(win32service.SERVICE_STOPPED)
    
        def SvcDoRun(self):
            self.process = Process(target=self.main)
            self.process.start()
            self.process.run()
    
        def main(self):
            app.run()
    
    
    if __name__ == '__main__':
        win32serviceutil.HandleCommandLine(Service)
    
     

    Взято из https://codecamp.ru/a/25130524/318488

Синтаксис

Параметры

Примечания