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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow