Python Language
Création d'un service Windows à l'aide de Python
Recherche…
Introduction
Les processus sans tête (sans interface utilisateur) sous Windows sont appelés services. Ils peuvent être contrôlés (démarrés, arrêtés, etc.) à l'aide de contrôles Windows standard tels que la console de commande, Powershell ou l'onglet Services du Gestionnaire des tâches. Un bon exemple pourrait être une application qui fournit des services réseau, tels qu'une application Web, ou une application de sauvegarde qui effectue diverses tâches d'archivage en arrière-plan. Il existe plusieurs manières de créer et d'installer une application Python en tant que service sous Windows.
Un script Python pouvant être exécuté en tant que service
Les modules utilisés dans cet exemple font partie de pywin32 (extensions Python for Windows). Selon la manière dont vous avez installé Python, vous devrez peut-être l'installer séparément.
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)
Ceci est juste un passe-partout. Votre code d'application, invoquant probablement un script séparé, irait dans la fonction main ().
Vous devrez également l'installer en tant que service. La meilleure solution pour le moment semble être d'utiliser Non-sucking Service Manager . Cela vous permet d'installer un service et fournit une interface graphique pour configurer la ligne de commande exécutée par le service. Pour Python, vous pouvez le faire, ce qui crée le service en une seule fois:
nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
Où my_script.py est le script standard ci-dessus, modifié pour appeler votre script ou code d'application dans la fonction main (). Notez que le service n'exécute pas directement le script Python, il exécute l'interpréteur Python et lui transmet le script principal sur la ligne de commande.
Vous pouvez également utiliser les outils fournis dans le Kit de ressources Windows Server pour la version de votre système d'exploitation afin de créer le service.
Exécution d'une application Web Flask en tant que service
Ceci est une variante de l'exemple générique. Il vous suffit d'importer votre script d'application et d'appeler sa méthode run()
dans la fonction main()
du service. Dans ce cas, nous utilisons également le module de multitraitement en raison d'un problème d'accès à 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)
Adapté de http://stackoverflow.com/a/25130524/318488