Python Language
Erstellen eines Windows-Dienstes mit Python
Suche…
Einführung
Headless-Prozesse (ohne Benutzeroberfläche) in Windows werden als Services bezeichnet. Sie können mit Standard-Windows-Steuerelementen wie der Befehlskonsole, Powershell oder der Registerkarte Dienste im Task-Manager gesteuert (gestartet, gestoppt usw.) werden. Ein gutes Beispiel ist eine Anwendung, die Netzwerkdienste bereitstellt, beispielsweise eine Webanwendung, oder eine Sicherungsanwendung, die verschiedene Hintergrundarchivierungsaufgaben ausführt. Es gibt mehrere Möglichkeiten, eine Python-Anwendung als Dienst in Windows zu erstellen und zu installieren.
Ein Python-Skript, das als Dienst ausgeführt werden kann
Die in diesem Beispiel verwendeten Module sind Teil von pywin32 (Python für Windows-Erweiterungen). Je nachdem, wie Sie Python installiert haben, müssen Sie dies möglicherweise separat installieren.
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)
Dies ist nur eine Platte. Ihr Anwendungscode, der wahrscheinlich ein separates Skript aufruft, würde in die Funktion main () gehen.
Sie müssen dies auch als Dienst installieren. Die beste Lösung hierfür scheint momentan der Einsatz von Non-sucking Service Manager zu sein . Dadurch können Sie einen Dienst installieren und stellen eine GUI zum Konfigurieren der Befehlszeile bereit, die der Dienst ausführt. Für Python können Sie dies tun, wodurch der Dienst auf einmal erstellt wird:
nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
Wo my_script.py das obige Boilerplate-Skript ist, wurde es so geändert, dass es das Anwendungsskript oder den Code in der Funktion main () aufruft. Beachten Sie, dass der Dienst das Python-Skript nicht direkt ausführt, sondern den Python-Interpreter und das Hauptskript an die Befehlszeile weitergibt.
Alternativ können Sie Tools verwenden, die im Windows Server Resource Kit für Ihre Betriebssystemversion bereitgestellt werden, um den Dienst zu erstellen.
Ausführen einer Flask-Webanwendung als Dienst
Dies ist eine Variation des generischen Beispiels. Sie müssen nur Ihr App-Skript importieren und die Methode run()
in der Funktion main()
des Dienstes aufrufen. In diesem Fall verwenden wir auch das Multiprocessing-Modul aufgrund eines Problems, das auf WSGIRequestHandler
zugreift.
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)
Angepasst von http://stackoverflow.com/a/25130524/318488