Python Language
Tworzenie usługi Windows za pomocą Pythona
Szukaj…
Wprowadzenie
Procesy bezgłowe (bez interfejsu użytkownika) w systemie Windows nazywane są usługami. Można je kontrolować (uruchamiać, zatrzymywać itp.) Za pomocą standardowych elementów sterujących systemu Windows, takich jak konsola poleceń, Powershell lub karta Usługi w Menedżerze zadań. Dobrym przykładem może być aplikacja zapewniająca usługi sieciowe, takie jak aplikacja internetowa, lub może aplikacja do wykonywania kopii zapasowych, która wykonuje różne zadania archiwizacji w tle. Istnieje kilka sposobów tworzenia i instalowania aplikacji Python jako usługi w systemie Windows.
Skrypt w języku Python, który można uruchomić jako usługę
Moduły użyte w tym przykładzie są częścią pywin32 (rozszerzenia Python dla Windows). W zależności od sposobu zainstalowania Pythona może być konieczne zainstalowanie go osobno.
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)
To tylko płyta kotłowa. Twój kod aplikacji, prawdopodobnie wywołujący osobny skrypt, przejdzie do funkcji main ().
Będziesz także musiał zainstalować to jako usługę. Obecnie najlepszym rozwiązaniem tego problemu jest użycie Menedżera usług niessących . Umożliwia to zainstalowanie usługi i zapewnia interfejs GUI do konfigurowania wiersza poleceń wykonywanego przez usługę. W przypadku Pythona możesz to zrobić, co tworzy usługę za jednym razem:
nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
Gdzie my_script.py to powyższy skrypt, zmodyfikowany w celu wywołania skryptu aplikacji lub kodu w funkcji main (). Zauważ, że usługa nie uruchamia bezpośrednio skryptu Python, uruchamia interpreter Pythona i przekazuje mu główny skrypt w wierszu poleceń.
Alternatywnie możesz użyć narzędzi zawartych w zestawie Windows Server Resource Kit dla swojej wersji systemu operacyjnego, więc utwórz usługę.
Uruchamianie aplikacji internetowej Flask jako usługi
Jest to wariacja na ogólny przykład. Wystarczy zaimportować skrypt aplikacji i wywołać jego metodę run()
w funkcji main()
. W tym przypadku używamy również modułu wieloprocesowego z powodu problemu z dostępem do 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)
Na podstawie http://stackoverflow.com/a/25130524/318488