336 votes

Est-il possible d’exécuter un script Python en tant que service dans Windows ? Si possible, comment ?

Je suis la définition de l'architecture d'un ensemble de programmes qui part de divers objets interdépendants stockées dans une base de données. Je veux de l'un des programmes d'agir comme un service qui offre un plus haut niveau de l'interface pour les opérations sur ces objets, et d'autres programmes pour accéder à des objets par le biais de ce service.

Je suis actuellement en visant Python et le framework Django comme les technologies à mettre en œuvre ce service. Je suis assez sûr que je figure comment diaboliser le programme en Python sous Linux. Cependant, il est une option spec point que le système de support de Windows. J'ai peu d'expérience avec la programmation sous Windows et pas d'expérience avec tous les services de Windows.

Est-il possible d'exécuter un Python programmes en tant que service Windows (j'. e. exécuter automatiquement sans connexion de l'utilisateur)? Je ne vais pas nécessairement à mettre en œuvre la présente partie, mais j'ai besoin d'une idée de comment il allait faire pour décider de la conception, le long de ces lignes.

Edit: Merci pour toutes les réponses jusqu'à présent, ils sont assez complètes. Je voudrais savoir une chose: Comment est Windows au courant de mon service? Puis-je les gérer avec le natif de Windows utilitaires? Fondamentalement, ce qui est l'équivalent de mettre une start/stop script dans /etc/init.d?

292voto

Ricardo Reyes Points 3428

Oui, vous pouvez. Je le fais à l'aide de la pythoncom bibliothèques qui viennent inclus avec ActivePython ou peut être installé avec pywin32 (Python pour Windows extensions).

C'est un squelette de base pour un service simple:

import pythoncom
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)

Votre code d'aller dans la méthode main (), généralement avec une sorte de boucle infinie qui pourrait être interrumped par le contrôle d'un drapeau, que vous définissez dans le SvcStop méthode

53voto

user1085954 Points 70

Bien que je upvoted choisi de répondre à quelques semaines en arrière, dans l'intervalle, j'ai lutté beaucoup plus à ce sujet. Il se sent comme ayant une installation de Python et utilisant des modules spéciaux pour exécuter un script en tant que service est tout simplement de la mauvaise façon. Quid de la portabilité et de tel?

Je suis tombé sur le merveilleux Non-sucer le Gestionnaire de Service, qui fait qu'il est vraiment simple et sain d'esprit pour faire face avec les Services Windows. J'ai trouvé depuis que je pourrait passer des options à un service installé, j'ai pu tout aussi bien choisir mon Python exécutable et passer mon script comme une option.

Je n'ai pas encore essayé cette solution, mais je vais le faire dès maintenant et mettre à jour ce post au long du processus. Je m'intéresse également à l'aide de virtualenvs sur Windows, donc je pourrais venir avec un tutoriel, tôt ou tard, et un lien vers ici.

23voto

popcnt Points 1842

Il ya un couple de solutions de rechange pour l'installation en tant que service pratiquement tous les exécutables Windows.

Méthode 1: Utiliser instsrv et srvany de rktools.exe

Pour Windows Home Server ou Windows Server 2003 (fonctionne avec WinXP trop), Windows Server 2003 Resource Kit Tools est livré avec des utilitaires qui peuvent être utilisés en tandem pour cela, appelé instsrv.exe et srvany.exe. Voir cet article de base de connaissances Microsoft KB137890 pour plus de détails sur la façon d'utiliser ces utils.

Pour Windows Home Server, il y a une grande convivial wrapper pour ces utilitaires nommé justement "Tout le Service programme d'installation".

Méthode 2: Utiliser ServiceInstaller pour Windows NT

Il existe une autre alternative à l'aide de ServiceInstaller pour Windows NT (téléchargeable ici) avec des instructions python disponible. Contrairement au nom, il fonctionne avec Windows 2000 et Windows XP. Voici quelques instructions pour savoir comment installer un script python en tant que service.

L'installation d'un script Python

Exécuter ServiceInstaller pour créer un nouveau service. (Dans cet exemple, il est supposé que python est installé à c:\python25)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

Après l'installation, ouvrez le Control Panneau de l'applet Services, de sélectionner et de démarrer le PythonTest service.

Après ma première réponse, j'ai remarqué qu'il y ont été étroitement liés Q&A déjà posté sur. Voir aussi:

Puis-je exécuter un script Python en tant que service (dans Windows)? Comment?

Comment puis-je faire de Windows conscience d'un service que j'ai écrit en Python?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X